使用nose进行Python单元测试:创建顺序测试

3 投票
2 回答
4695 浏览
提问于 2025-04-15 20:56

我正在学习如何进行单元测试,使用的是Python、nose和Wing IDE。

(我正在为一个模拟框架写测试,这个框架可以让你同时和异步地运行模拟,结果在两种模式下应该是一样的。)

问题是,我希望我的一些测试能够使用在其他测试中生成的模拟结果。例如,synchronous_test在同步模式下计算了一个特定的模拟结果,但我还想在异步模式下计算这个结果,并检查两者是否相同。

我该怎么安排这些测试呢?是把它们放在一个测试函数里,还是单独写一个asynchronous_test?我需要把这些对象从一个测试函数传递到另一个测试函数吗?

另外,请记住,所有这些测试都是通过一个测试生成器运行的,这样我就可以对我程序中包含的每个模拟包进行测试。

2 个回答

6

一般来说,我建议你不要让一个测试依赖于另一个测试。你应该分别进行同步测试和异步测试,然后把它们各自的结果和预期的正确结果进行比较,而不是互相比较。

所以可以像这样做:

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

你可以把那些每个类只需要计算一次的测试,放到这个类的“设置”部分。举个例子:

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)

撰写回答