Python运行连续测试或每次测试多次

时间:2015-05-10 05:54:57

标签: python unit-testing nose

我已编写单元测试用例来测试我的应用程序。并且它正在按预期工作而没有问题。

下面是一些示例测试用例

import os
import unittest

class CreateUser(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass
    def test_send_message(self):
        #my script goes here
        print "success"
if __name__ == '__main__':
    unittest.main()

如果我运行此测试,它按预期执行但我想运行此测试用例'N'没有时间

为此我在main函数中添加了for循环,也只运行了一次,代码我用如下

 if __name__ == '__main__':
    for i in range(1, 5):
         unittest.main()  

我还使用schedule lib每10分钟运行一次测试,但没有运气

有没有办法多次运行此测试用例或我缺少的任何其他工作或任何其他连续构建工具来实现此目的?

提前致谢

3 个答案:

答案 0 :(得分:7)

首先,请注意一点。

为什么要五次运行相同的测试?我不想在没有看到你的代码的情况下做出假设,但这是一个非常严重的代码味道。单元测试必须可重复,如果连续运行五次并不会产生与运行一次相同的结果,那么测试中的某些内容是不可重复的。特别是,如果测试的早期运行会产生后续运行所使用的副作用,或者如果涉及某种随机数,则这两种情况都是非常糟糕的情况需要修复而不是多次运行测试。鉴于我们在这里提供的信息,最好的建议似乎很可能不会多次运行该测试!

话虽如此,你有几个不同的选择。

  1. 将循环置于测试
  2. 假设有五次调用函数有一些有意义的事情,那么做这样的事情是完全合理的:

    def test_function_calls(self):
        for _ in xrange(1, 5):
            self.assertTrue(f())
    
    1. 由于您提到了nose标记,因此您可以选择参数化测试,这通常包括对不同的输入值运行相同的(代码)测试。如果您使用https://github.com/wolever/nose-parameterized之类的内容,那么结果可能是这样的:
    2. @parameterized.expand([('atest', 'a', 1), ('btest', 'b', 2)])
      def test_function_calls(self, name, input, expected):
          self.assertEqual(expected, f(input))
      

      顾名思义,参数化测试通常用于检查具有多个数据的一个代码测试。如果您只想让测试运行多次,您可以拥有一个包含虚拟数据的列表,但这是另一个可疑的代码结构,可以追溯到我的原始点。

      额外注意:几乎所有“连续”构建工具都设置为触发构建/测试/等。在特定条件或事件上,例如将代码提交到存储库时。他们只是连续连续运行测试是非常不寻常的。

      我尽力在这里回答你的问题,但我觉得缺少了一些东西。您可能想要明确说明您要完成的工作以获得最佳答案。

答案 1 :(得分:2)

我喜欢在简单的bash循环中运行这种东西。当然,这只适用于你使用bash:

while true; do python setup.py test ; done

答案 2 :(得分:0)

道歉,作为新用户,我无法发表评论。 我只想回应GrandOpener对你想要重新执行测试的担忧。我本人处于类似的情况,我有'不可靠'的测试。我用不可靠或不确定的测试看到的问题是,很难证明你已经修复它们,因为它们可能只会失败1/100次。

我的想法是,我将执行有问题的测试X次,建立一个在失败之前发生了多少次测试迭代的分布。有了这个我认为我要么能够a)使用失败前的最大迭代次数作为检查后不可靠性'修复'的迭代次数或b)使用一些花哨的统计方法来证明可靠性'修复'可能是Y%解决了这个问题。

没有恶意或屈尊俯就,GrandOpener如何证明他想象中不可靠的测试已被修复?