您的位置:首页 > 编程语言 > Python开发

nose1.3.7文档翻译--3.Writing tests

2017-01-02 12:09 411 查看
和py.test一样,nose测试例并不需要继承unittest.TestCase。任何匹配testMatch正则表达式(默认为(?:^|[\b_\.-]),在一个单词的边界处或者紧跟-或_处有test或Test)的函数或类,并且所在的模块也匹配该表达式,都将会以测试的方式运行。出于对unittest测试例 兼容性的考虑,nose也会像unittest一样加载来自于unittest.TestCase子类的测试例。与py.test类似,nose以它们在模块文件中出现的顺序运行测试例。继承于TestCase的测试和其他的类测试按照字母顺序运行。

Fixtures

nose支持包级别,模块级别,类级别和单个测试例级别的Fixtures(setup和teardown方法,其实按照翻译过来就是固定装置,在自动化测试中就表示设置setup和teardown等初始化或者清理工作的固定格式。)。和py.test unittest一样,setup总是在任何用例(或者从包和模块中收集的测试例集合)之前运行。如果setup成功运行,不管测试例运行结果如何,teardown都会接着测试例之后运行。更多内容可查看下文中每一级别的fixtures。

Test packages

nose允许测试例以包的方式分组。因此,也需要包级别的setup;比如,如果你想要创建一个测试数据库,或其他数据fixture,你可能会想要在包setup时创建数据库,当每个测试结束之后运行包teardown时,销毁它。而不是在每一个测试模块或者测试例中创建和销毁数据库。

想要创建包级别的setup和teardown函数,你需要在测试包的_ init_.py 函数中定义setup和teardown函数。setup函数可以被命名为setup,setup_package,setUp,或者setUpPackage;teardown可以被命名为teardown,teardown_package, tearDown, 或者tearDownPackage。一旦第一个测试模块从测试包中被加载后,一个包中的测试例就开始执行。

Test modules

一个测试模块是一个匹配testMatch的python模块。测试模块提供模块级别的setup和teardown。可以定义setup, setup_module, setUp, setUpModule用于setup,teardown, teardown_module, tearDownModule用于teardown。一旦一个模块中所有的用例被收集完后,模块中的测试就开始执行。

Test classes

一个测试类是模块中定义的匹配testMatch或者继承unittest.TestCase的类。所有的测试类以相同方式运行:类中的匹配testMatch的方法被查找到,一个测试例被构造以全新的类实例运行。像继承于unittest.TestCase的子类一样,其他的测试类可以定义setUp tearDown函数,它们将会分别在每一个测试方法之前和之后运行。不从unittest继承的测试类,或许也会包括generator方法和类级别fixtures。类级别setup fixture可以被命名为setup_class, setupClass, setUpClass, setupAll, setUpAll;teardown被命名为teardown_class, teardownClass, tearDownClass, teardownAll, tearDownAll, 类级别setup和teardown必须是类方法。

Test functions

模块中任何匹配TestMatch的方法都将会被FunctionTestCase装饰,然后以用例的方式运行。下面可能是最简单的失败的测试例:

def test():
assert False


最简单的通过的测试例:

def test():
pass


测试函数可能需要定义setup和teardown属性,它们将会在测试函数开始和结束的时候运行。一个方便的方式是,使用被提供的with_setup装饰器。该方式尤其适用于在相同的模块中的许多方法需要相同的setup操作。

def setup_func():
"set up test fixtures"

def teardown_func():
"tear down test fixtures"

@with_setup(setup_func, teardown_func)
def test():
"test ..."


对于python 2.3或更早版本,可以通过类似以下装饰器函数增加属性:

def test():
"test ... "
test = with_setup(setup_func, teardown_func)(test


或者直接分配:

test.setup = setup_func
test.teardown = teardown_func


请注意,with_setup仅仅用于测试函数,并不适用于unittest.TestCase子类或者其他测试类中的测试方法。这种情况,可以在类中定义setUp和tearDown方法。

Test generators

nose支持生成器测试函数和测试方法。一个简单的例子,来自于nose的selftest suite:

def test_evens():
for i in range(0, 5):
yield check_even, i, i*3

def check_even(n, nn):
assert n % 2 == 0 or nn % 2 == 0


这将会导致五次测试。nose将会迭代生成器,创建一个函数测试例包装,包装tuple中每一个yields。正如例子中体现的,测试生成器必须yield 元组,yield 参数中第一个元素必须是可调用的,其他的元素作为参数传递。

默认的,生成器用例在冗长的模式下,测试名输出将会是生成器函数或方法的名字,紧接着是yield 可调用参数的其他参数。如果你想要显示不同的测试名,可以设置yield可调用参数中description属性。

setup和teardown函数可能也会被用于测试生成器中。然而,请注意生成器函数的setup和teardown属性仅仅会被执行一次。如果想要对于每一个yield的用例都执行fixtures,可以将setup和teardown属性设置到被yield的函数中,或者yield一个带有setup和teardown属性的可调用对象的实例。

例如:

@with_setup(setup_func, teardown_func)
def test_generator():
# ...
yield func, arg, arg # ...


以上,setup和teardown只会被执行一次。与此相比:

def test_generator():
# ...
yield func, arg, arg # ...

@with_setup(setup_func, teardown_func)
def func(arg):
assert something_about(arg)


后者setup和teardown函数将会在每一次yield 测试中执行。

对于生成器方法,类中的setUp和tearDown方法将会在每一个生成的测试例之前或者之后运行。setUp和tearDown方法并不会在生成器方法本身 之前运行,这就是导致在第一个用例运行之前setUp运行两次,之间却没有tearDown运行的原因。

请注意,generators方法在unittest.TestCase子类中并不被支持。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息