【问题标题】:Python unit-testing with nose: Making sequential tests用鼻子进行 Python 单元测试:进行顺序测试
【发布时间】:2010-03-28 09:24:37
【问题描述】:

我只是在学习如何进行单元测试。我在 Python/nose/Wing IDE 上。

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

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

我该如何构建它?我是将它们全部放在一个测试函数中,还是单独创建一个asynchronous_test?我是否将这些对象从一个测试函数传递到另一个测试函数?

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

【问题讨论】:

  • 你能指出一些你想测试的具体课程吗?
  • bebraw,我不明白你的问题。我想测试simulatelist_simulate 函数,以及Project 类和其他东西。
  • 好的。考虑到该项目是开源的,我认为阅读一些实际代码可能会很有趣。 :)

标签: python unit-testing nose


【解决方案1】:

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

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)

【讨论】:

  • calculate_it_once() 失败时会发生什么?
  • 我假设您知道“答案”(可能通过使用 random.setseed() 或其他方式)。如果不是,那么您能做的最好的事情就是断言 sync 和 async 是相同的,并且 that 是测试。我分叉了你的代码,但我没有机会查看它。
【解决方案2】:

一般来说,我建议不要让一项测试依赖于另一项测试。进行同步测试,进行异步测试,将它们分别与预期的正确输出进行比较,而不是相互比较。

比如:

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)

【讨论】:

  • 那么在哪里我应该计算预期的正确输出?因为这个输出的计算是需要自己去测试的。
  • 你如何测试那个?将其与...本身进行比较?您必须在某个地方知道良好的输出。从泡菜中加载它? (用代码更新答案)
  • 我想你说得有道理。虽然我不会从泡菜中加载——以这种方式进行更改并不容易。我想我会考虑像 Gregg Lind 的例子那样做。一个问题:如果我只是将许多测试放在一个连续函数中,你认为这很糟糕吗?那么我就不用担心这些事情了,如果有一件事情失败了,我无论如何都需要修复它。
  • 较小的函数,在测试或其他代码中,通常更容易跟踪正在发生的事情。当您进行更多测试时,您会欣赏测试工具能够准确告诉您哪些测试失败以及当您更改某些内容时哪些仍然有效。
  • 此外,拥有setup 结构来为您的不同测试提供一致的状态和simpacks 在这里似乎很有好处。
猜你喜欢
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 2012-10-09
  • 2012-01-08
相关资源
最近更新 更多