Функция вызова юнит-теста Python, когда утверждение проходит

Я не могу найти способ сделать do_something(), когда утверждение в тесте проходит. Например:

    def test_one(self):
        self.assertEqual(1,1, "Did not match")

Этот тест выведет "Не совпадает", если утверждение не будет выполнено, но в этом случае оно не будет выполнено, поэтому я пытаюсь вызвать функцию или напечатать что-то, когда self.assertEqual() успешно, пожалуйста, какие-нибудь идеи?

Спасибо

2 ответа

Решение

Если вы хотите печатать, когда что-то проходит, есть несколько вариантов. Однако, пожалуйста, не используйте ответ Ноэльда. Не то, чтобы это неправильно, просто вы не хотите загромождать свой тест кучей print сообщения, когда unittest предоставляет лучшие способы сделать это.

многословие

Если вы хотите напечатать результат каждого test_ функция, установите многословие бегуна теста. Вы можете сделать это несколькими способами:

  1. Из командной строки используйте параметр verbose:

    python -m unittest discover -v

  2. Программно вызывая unittest.main и передать его аргумент многословия

    if __name__ == "__main__":
        unittest.main(verbosity=2)
    

Запуск тестов "вручную"

  1. Программно создайте свой TestSuite и вызовите TestRunner с аргументом многословия.

    suite = unittest.TestLoader().loadTestsFromModule(TestModuleName)
    results = unittest.TextTestRunner(verbosity=2).run(suite)
    
  2. Создание подкласса объекта 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

Надеюсь это поможет.

Другие вопросы по тегам