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

和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子类中并不被支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值