2017-08-06 84 views
0

我有一个Python单元测试像下面,我想运行的时间如何运行单元测试蟒蛇N多的时间

class Test(TestCase) 

    def test_0(self): 
      ......... 
      ......... 
      ......... 

Test.Run(name=__name__) 

任何建议,因此整个试验N号码?

+2

好问题是为什么你想要那个?单元测试框架词意图允许测试方法的结果,所以多次运行相同的测试并不合理。如果你想控制执行时间,要使用的模块是'timeit'。 –

+0

为什么?因为... test_0方法包含一个随机选项..所以每次运行它时都会根据这些配置选择随机数的配置和测试。所以我不会多次测试相同的东西。 – ulta

+1

即使对随机值运行多个测试也很奇怪。当你想控制进化没有带来回归的时候,测试的目的是再次运行,总是有相同的结果。选择一些*有趣的*配置并测试它们。如果你想了解参数化测试,你可以看看https://stackoverflow.com/q/32899/3545273 –

回答

0

您可以使用参数化测试。有不同的模块可以做到这一点。我使用鼻子来运行我的unittests(比默认的unittest模块更强大),并且有一个名为nose-parameterized的包,它允许您编写一个工厂测试,并使用不同的值运行多次,以获得所需的变量。 如果您不想使用鼻子,还有其他几种运行参数化测试的选项。

或者,您可以在单个测试中执行任意数量的测试条件(只要一次测试失败,测试将报告错误)。在你的特定情况下,这可能比参数化测试更有意义,因为实际上它只是一个测试,只是需要大量的函数运行才能达到某种程度的信心,以确保它正常工作。所以,你可以这样做:

import random 
class Test(TestCase) 

    def test_myfunc(self): 
     for _ in range(100): 
      input = random.random() 
      self.assertEquals(input, input + 2) 


Test.Run(name=__name__) 
0

为什么?因为...的test_0方法中包含一个随机选择..所以每次运行时,它选择的配置和测试,对这些配置的随机数。所以我不是多次测试相同的东西..

测试中的随机性使其不可重现。有一天,你可能会失败100次,当你再次运行它时,它已经消失了。

使用新型测试工具有一个序列号,参数化测试,然后使用random.seed有一个随机但重复性测试用例序列中的每个号码。

portusato暗示的鼻子,但pytest是一个更现代和流行的工具:

import random, pytest 

@pytest.mark.parametrize('i', range(100)) 
def test_random(i): 
    orig_state = random.getstate() 
    try: 
     random.seed(i) 
     data = generate_random_data() 
     assert my_algorithm(data) == works 
    finally: 
     random.setstate(orig_state) 

pytest.mark.parametrize“爆炸”的单一test_random到100个独立的测试 - test_random[0]通过test_random[99]

$ pytest -q test.py 
.................................................................................................... 
100 passed in 0.14 seconds 

每这些测试会为您的算法生成不同的随机但可重现的输入data。如果test_random[56]失败,则每次都会失败,因此您将能够对其进行调试。