Python, запустить тест, отправить электронное сообщение, если он не работает

Я хочу запустить тест, и если он не сработает, отправьте электронное письмо. Пожалуйста, предложите мне сделать это с помощью любых обычных фреймворков, таких как UnitTest. Я не нашел способ изменить его поведение, когда он терпит неудачу.

5 ответов

Вы можете предоставить свою собственную реализацию unittest.TestResult для отправки электронной почты следующим образом:

import smtplib
import unittest
def sendmail(from_who, to, msg):
 s = smtplib.SMTP('localhost')
 s.sendmail(from_who, [to], msg)
 s.quit()
class MyTestResult(unittest.TestResult):
 def addError(self, test, err):
 self.super(MyTestResult, self).addError(test, err) 
 err_desc = self._exc_info_to_string(err, test)
 sendmail(from_who, to, err_desc)
 def addFailure(self, test, err):
 self.super(MyTestResult, self).addFailure(test, err)
 err_desc = self._exc_info_to_string(err, test)
 sendmail(from_who, to, err_desc)
if __name__ == '__main__':
 suite = unittest.TestLoader().loadTestsFromModule() 
 results = MyTestResult()
 suite.run(results)


Вы можете переопределить метод run() unittest.TestSuite/TestCase, чтобы уведомить результат теста по электронной почте или любым другим каналам. Проверьте их:


Вы можете использовать ткань для обработки результата теста и отправки по электронной почте. Самое приятное в этом подходе заключается в том, что вы не изменяете свои модульные тесты. То есть вы все равно можете запустить python mytest.py без отправки ненужных сообщений электронной почты, например. в локальной среде.

Скажем, у вас есть этот unittest в файле mytest.py:

class MyTest(unittest.TestCase):
 def test_spam(self):
 ...
 self.assertTrue(condition) 
if __name__ == '__main__':
 unittest.main()

В fabfile.py добавить:

def test(from_email="[removed_email]",
 to_email="[removed_email]"):
 with settings(warn_only=True):
 result=local('python mytest.py', capture=True)
 if result.failed:
 # prepare message
 msg = MIMEText(result)
 msg['From'] = from_email
 msg['To'] = to_email
 msg['Subject'] = "Tests failed"
 # send email
 s = smtplib.SMTP('localhost')
 s.sendmail(from_email, [to_email], msg.as_string())

Затем вы можете просто вызвать свой тест следующим образом:

# send to default email address
fab test
# send to another email address
fab test:to_email="[removed_email]"


По какой-то причине не все ответы @GabiMe работали для меня. Вместо этого я использовал:

def sendmail(from_who, to, msg):
 s = smtplib.SMTP('localhost')
 s.sendmail(from_who, [to], msg)
 s.quit()
class TestResults(unittest.TestResult):
 def addError(self, test, err):
 super(TestResults, self).addError(test, err) 
 error = self._exc_info_to_string(err, test)
 sendmail(from_who, to, err_desc)
 def addFailure(self, test, err):
 super(TestResults, self).addFailure(test, err)
 error = self._exc_info_to_string(err, test)
 sendmail(from_who, to, err_desc)
if __name__ == '__main__':
 suite = unittest.TestSuite(
 unittest.TestLoader().discover('tests')
 )
 results = TestResults()
 suite.run(results)

где tests - имя папки, содержащей мои тесты.


вы могли бы попробовать, кроме блока

import script
try:
 script()
except Exception, e:
 import smtplib
 from email.mime.text import MIMEText
 msg['Subject'] = 'Script failed!!'
 msg['From'] = me
 msg['To'] = you
 s = smtplib.SMTP('localhost')
 s.sendmail(me, [you], e.message)
 s.quit()

licensed under cc by-sa 3.0 with attribution.