代码之家  ›  专栏  ›  技术社区  ›  Ram Rachum

用鼻子进行python单元测试:进行顺序测试

  •  3
  • Ram Rachum  · 技术社区  · 14 年前

    我只是在学习如何进行单元测试。我在巨蟒/鼻子/翼侧。

    ( The project 我为之编写的测试是一个模拟框架,它允许您同时和异步地运行模拟,并且模拟的结果在这两者中应该是相同的。)

    问题是,我希望我的一些测试使用在其他测试中创建的模拟结果。例如, synchronous_test 在同步模式下计算某个模拟,但是我想在异步模式下计算它,并检查结果是否相同。

    我该如何构造这个?我是将它们放在一个测试函数中,还是将它们分开 asynchronous_test ?我是否要将这些对象从一个测试函数传递到另一个测试函数?

    此外,请记住,所有这些测试都将通过测试生成器运行,因此我可以为程序中包含的每个模拟包进行测试。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Gregg Lind    14 年前

    您可以将每个类需要计算一次的测试添加到该类的“设置”中。举个例子:

    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)
    
        2
  •  6
  •   keturn    14 年前

    总的来说,我建议 做一个测试取决于另一个。进行同步测试,进行异步测试,将它们与预期的正确输出进行比较,而不是相互比较。

    比如:

    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)