Юнит-тестирование Python с носом: создание последовательных тестов - PullRequest
3 голосов
/ 27 марта 2010

Я только учусь делать юнит-тестирование.Я нахожусь на Python / nose / Wing IDE.

( Проект , для которого я пишу тесты, является фреймворком симуляции, и среди прочего он позволяет вам запускать симуляции одновременно иасинхронно, и результаты моделирования должны быть одинаковыми в обоих случаях.)

Дело в том, что я хочу, чтобы некоторые из моих тестов использовали результаты моделирования, которые были созданы в других тестах.Например, synchronous_test вычисляет определенное моделирование в синхронном режиме, но затем я хочу вычислить его в асинхронном режиме и проверить, чтобы результаты были одинаковыми.

Как мне это структурировать?Я помещаю их всех в одну тестовую функцию или создаю отдельный asynchronous_test?Я передаю эти объекты из одной тестовой функции в другую?

Кроме того, имейте в виду, что все эти тесты будут проходить через генератор тестов, поэтому я могу выполнять тесты для каждого из пакетов моделирования, включенных в мою программу..

Ответы [ 2 ]

6 голосов
/ 27 марта 2010

Вы можете добавить тесты, которые необходимо рассчитать один раз для каждого класса, в «настройку» этого класса. Как пример:

from nose.tools import *
class Test_mysim():
    def setup(self):
        self.ans = calculate_it_once()

    def test_sync(self):
        ans=calculate_it_sync()
        assert_equal(ans,self.ans)

    def test_async(self):
        ans=calculate_it_async()
        assert_equal(ans,self.ans)
6 голосов
/ 27 марта 2010

В общем, я бы рекомендовал , а не , чтобы один тест зависел от другого. Выполните synchronous_test, выполните asynchronous_test, сравните их каждый с ожидаемым правильным выводом, а не друг с другом.

Так что-то вроде:

class TestSimulate(TestCase):
    def setup(self):
        self.simpack = SimpackToTest()
        self.initial_state = pickle.load("initial.state")
        self.expected_state = pickle.load("known_good.state")

    def test_simulate(self):
        state = simulate(self.simpack, self.initial_state)
        # assert_equal will require State to implement __eq__ in a meaningful
        # way.  If it doesn't, you'll want to define your own comparison 
        # function.
        self.assert_equal(self.expected_state, state)

    def test_other_simulate(self):
        foo = OtherThing(self.simpack)
        blah = foo.simulate(self.initial_state)
        state = blah.state
        self.assert_equal(self.expected_state, state)
...