Python 连续运行单元测试或每个测试多次

标签 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”次

为此,我在主函数中添加了 for 循环,而且它只运行一次,我使用的代码如下

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

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

是否有任何方法可以多次运行此测试用例或我缺少的任何其他解决方案或任何其他连续构建工具来实现此目的?

提前致谢

最佳答案

首先,要小心一点。

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

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

  1. 将循环放入测试中

假设调用函数五次是有意义的,那么执行以下操作是完全合理的:

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

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

    附注:几乎所有“连续”构建工具都设置为触发构建/测试/等。在特定条件或事件上,例如将代码提交到存储库时。对于他们来说,简单地连续运行测试是很不寻常的。

    我已经尽力回答你的问题了,但我感觉缺少了一些东西。您可能想要准确地澄清您想要完成的任务,以获得最佳答案。

    关于Python 连续运行单元测试或每个测试多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30148221/

    相关文章:

    python - 安装了 Nose 但不能在命令行上使用

    python - 当多个输入同时滴答时,如何防止 combine_latest 多次触发?

    Java/Mockito - 线程在重试之前以指数方式 hibernate 的单元测试

    unit-testing - 在单页应用程序中使用 Disqus 的最佳方法是什么?

    android - java.lang.IllegalAccessError : Class ref in pre-verified class resolved to unexpected implementation getting while running test project?

    Python跨模块全局变量

    python - 如何编写装饰器在未导入模块时跳过某些测试?

    python - PyMySQL 选择不工作

    python - 正则表达式替换无法在Python中用正则表达式变量替换

    python - 如何为 "label for"设置正确的 xpath