Функция вызова юнит-теста Python, когда утверждение проходит
Я не могу найти способ сделать do_something(), когда утверждение в тесте проходит. Например:
def test_one(self):
self.assertEqual(1,1, "Did not match")
Этот тест выведет "Не совпадает", если утверждение не будет выполнено, но в этом случае оно не будет выполнено, поэтому я пытаюсь вызвать функцию или напечатать что-то, когда self.assertEqual() успешно, пожалуйста, какие-нибудь идеи?
Спасибо
2 ответа
Если вы хотите печатать, когда что-то проходит, есть несколько вариантов. Однако, пожалуйста, не используйте ответ Ноэльда. Не то, чтобы это неправильно, просто вы не хотите загромождать свой тест кучей print
сообщения, когда unittest
предоставляет лучшие способы сделать это.
многословие
Если вы хотите напечатать результат каждого test_
функция, установите многословие бегуна теста. Вы можете сделать это несколькими способами:
Из командной строки используйте параметр verbose:
python -m unittest discover -v
Программно вызывая
unittest.main
и передать его аргумент многословияif __name__ == "__main__": unittest.main(verbosity=2)
Запуск тестов "вручную"
Программно создайте свой TestSuite и вызовите TestRunner с аргументом многословия.
suite = unittest.TestLoader().loadTestsFromModule(TestModuleName) results = unittest.TextTestRunner(verbosity=2).run(suite)
Создание подкласса объекта TestResult, который содержит метод addSuccess, который будет вызываться при каждом прохождении теста.
Затем вы можете передать этот объект TestResult методу запуска Test Suite.
suite = unittest.TestLoader().loadTestsFromModule(TestModuleName) suite.run(myTestResult)
Сторонние бегуны
Посмотрите на Twisted's Trial. Он содержит много разных бегунов, которые могут быть полезны. По умолчанию он запускает TreeReporter
который выглядит как:
Это работает:
import unittest
class TestupSomeStuff(unittest.TestCase):
def setUp(self):
pass
def test_fail(self):
x = 2 * 4
self.assertEqual(x,9,"DID NOT MATCH")
print "Passed"
def test_pass(self):
x = 2 * 4
self.assertEqual(x,8,"DID NOT MATCH")
print "Passed"
if __name__ == "__main__":
unittest.main()
Это происходит потому, что если ваш assert не пройден, то тест не пройден, и вы переходите к следующему тесту, однако, если тест прошел успешно, он продолжается и возвращает None!
Например:
import unittest
class TestupSomeStuff(unittest.TestCase):
def setUp(self):
pass
def test_fail(self):
return None
# This is skipped, so test is win
x = 2 * 4
self.assertEqual(x,9,"DID NOT MATCH")
print "FAIL"
def test_pass(self):
x = 2 * 4
self.assertEqual(x,8,"DID NOT MATCH")
# Passed gets printed after the dot for passing the previous test.
print "Passed"
Печать:
.Passed
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
Надеюсь это поможет.