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

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

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

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

Спасибо


person PepperoniPizza    schedule 21.05.2013    source источник


Ответы (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, который содержит < метод href="http://docs.python.org/2/library/unittest.html#unittest.TestResult.addSuccess" rel="nofollow noreferrer">addSuccess, который будет вызываться при каждом прохождении теста.

    Затем вы можете передать этот объект TestResult методу запуска Test Suite< /а>.

        suite = unittest.TestLoader().loadTestsFromModule(TestModuleName)
        suite.run(myTestResult)
    

Сторонние бегуны

Взгляните на пробную версию Twisted. Он содержит множество различных Test Runners, которые могут быть полезны. . По умолчанию он запускает TreeReporter, который выглядит так:

Пробная отчетность

person Carlos V    schedule 22.05.2013

Это работает:

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()

Это связано с тем, что если ваше утверждение терпит неудачу, то тест завершается неудачей, и вы переходите к следующему тесту, однако, когда тест проходит успешно, он продолжается и возвращает 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

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

person Noelkd    schedule 21.05.2013
comment
Хотя это помогает выполнить то, что хочет OP, существует много разных способов выполнить одно и то же с помощью встроенных инструментов. - person Carlos V; 22.05.2013
comment
Честно говоря, я просто хотел продемонстрировать простой способ печати сообщения без необходимости использования методов подкласса для получения другого сообщения. Хороший ответ. - person Noelkd; 22.05.2013
comment
использование print - плохая идея, когда вы используете Unittest , он имеет привычку коверкать стандартный вывод и часто может сделать неясным, когда на самом деле был запущен оператор печати. Лучший подход — не полагаться на стандартный вывод, а использовать подсистему ведения журнала python. - person Amias; 16.08.2016