2012-08-17 54 views
13

我正在测试用python编写的web应用程序。Python鼻子测试跳过某些测试

假设我在我的test_login.py模块中有5个测试。

每一个测试都是一个类。

经常有一个扩展TestFlow类的基础测试,它是我们预定义的测试类。

然后本模块中的其他测试扩展了该基础测试。

例如:

#The base test 

TestLogin(TestFlow): 
    #do login_test_stuff_here 

#Another test in the same module 

TestAccountDetails(TestLogin) 
    #do account_details_test_stuff_here 

... 

这实际上是相当方便的,因为为了测试例如AccountDetails用户必须先登录,这样我就可以从TESTLOGIN测试继承,我准备好测试等功能作为登录用户。

所有测试都在Project/project/tests文件夹中。

我们使用nosent与选项--with-pylons进行测试。

而我的问题是,如果有一种方法来标记某些TestClass为“不要测试这一个”。

因为我不想浪费时间直接执行这些“基本测试”,因为它们将由其他测试执行,并由它们执行。

可能会有这些测试的音调,我希望每一秒都可以保存。

我已经发现了一些像跳跃,SkipTest或@nottest,但对于一个ceratin的TestClass内test_methods这些唯一的工作,所以我不认为它会在这里工作,是我对每一个类测试用例。

回答

2

http://nose.readthedocs.org/en/latest/writing_tests.html

写作考试

与py.test,鼻试验不必 的unittest.TestCase生成子类。与默认配置的 testMatch正则表达式((?:^ | [\ b _ \ .-])[Tt] est)相匹配的任何函数或类,即在单词边界处具有test或Test或 - 或_) 并且生活在一个与该表达式匹配的模块中将作为 运行一个测试。为了兼容旧版单元测试测试用例, nose还将加载unittest.TestCase子类的测试,就像 unittest那样。像py.test一样,鼻子以 的顺序运行功能测试,它们出现在模块文件中。 TestCase派生的测试和其他测试类按字母顺序运行。

注意上面的正则表达式和规则。将函数/方法/类命名为不匹配正则表达式,并且它们不会运行。

这是说,我不建议你的链接继承测试的建议。这是一个沮丧和混乱的秘诀。

在制作mixin类或定义一个没有任何实际测试的基类时,你可能会更好 - 但有很多继承类的辅助函数可以调用并用作它们自己的函数。

如果你看看更受欢迎的软件包的测试,他们几乎都会使用这种方法。

+0

请注意,匹配正则表达式不是唯一包含的门 - * nose还会从unittest.TestCase子类*加载测试。它似乎也会为它输入的任何内容执行此操作。我在名为'foo_helpers.py'的模块中有一个名为'FooMixin'的测试,因为它是从'unittest.TestCase'派生出来的,所以我们将其视为一个测试。 – 2013-05-29 12:41:12

12

形式nosetests可以如下通过指定属性 http://nose.readthedocs.org/en/latest/plugins/attrib.html

通常情况下测试你将要选择基于标准而不是简单地通过文件名测试时进行。例如,您可能想要运行除慢速测试以外的所有测试。你可以通过在你的测试方法中设置属性来完成属性选择器插件。这里有一个例子:

def test_big_download(): 
    import urllib 
    # commence slowness... 

test_big_download.slow = 1 

一旦指定慢= 1的属性,您可以排除测试和运行

$ nosetests -a '!slow' 
2

实际上,你可以使用具有缓慢的属性的所有其他测试Classes的skiptest也是如此。

import unittest 

@unittest.skip("Class disabled") 
class TestLogin(TestFlow): 
    ... 
+0

请注意,在Python <= 2.6中,您需要安装unittest2才能使其工作。 – gaborous 2015-11-11 11:51:58

+1

这不适用于提供的用例。将skip装饰器添加到基类将导致所有子类也被跳过。即使您在子类上使用了“@ unittest.skipIf(True,”基类“)”和子类上的@ @ unittest.skipIf(False,“”)“,子类仍然会被跳过 – 2017-01-31 22:51:33