Python自动化 nose2 这个自动化工具让我写代码快了一倍 (二)

yuze · 2020年02月04日 · 116 次阅读

上一篇文章介绍了 nose2 的简单啊使用,请参考:这篇文章。 这一篇介绍 nose2 的一些高级特性。


测试用例方法的编写

与unittest不同的是,nose2 的测试用例并不一定要以类的形式存在,也可以使用函数。任何函数和类,只要名称匹配一定的条件(例如,以test开头或以test结尾等),都会被自动识别为测试用例。

def test_add():
    assert 1 == 2


if __name__ == '__main__':
    nose2.main()


参数化

类似于 unittest 当中的 ddt 模块,不过比 ddt 模块使用起来简洁一些。在测试过程当中,通常会有多组测试用例数据,多组测试用例会共用一个测试用例的方法,从而实现数据驱动。在 nose2 当中你可以这样使用:

import nose2
from nose2.tools import params

def add(a, b):
    return a + b

test_data = [
    {"data": (1, 2), "expected": 3},
    {"data": (2, 2), "expected": 4},
    {"data": (3, 2), "expected": 6},
]

@params(*test_data)
def test_add(data):
    assert add(*data["data"]) == data["expected"]

1, @params(*test_data) 会接收外部传进来的多组测试数据;

2,test_add(data) 当中的 data 每次取出一组数据运行,所以,data 其实就是 {"data": (1, 2), "expected": 3} 这样的一组数据。

3,这里因为有 3 组数据,所以运行的时候会有 3 个测试用例。


测试夹具

测试夹具是为了给测试用例准备前置条件和后置条件。

  • @with_setup(before_test) 表示在测试用例执行之前要执行的前置条件
  • @with_teardown(after_test) 表示在测试用例执行之后的后置条件
  • before_test 和 after_test 是自己定义的函数
from nose2.tools.decorators import with_setup, with_teardown

def before_test():
    print("before test")

def after_test():
    print("after test")

@with_setup(before_test)
@with_teardown(after_test)
def test_add(data):
    assert add(*data["data"]) == data["expected"]


nose2 vs unittest

nose2 上手会比 unittest 更简单。

使用 unittest, 需要同时掌握 testrunner, testsuite, testcase 等基本概念,还需要熟悉类和对象。 nose2 隐藏了这些细节设计,难度会更低一些。

nose2 可以直接运行 unittest 的测试用例,可以实现无缝切换。

但是并不是说 unittest 就不好。 unittest 做为一个 python 标准库,和 python 版本绑定,非常稳定,不用担心兼容性的问题。

如果要学习一个单元测试框架,建议从 unittest 开始,因为你可以接触到 loader, suite, runner 这样的组件,对理解测试框架更有帮助,学习好 unittest 以后,再学习 nose2 或者 pytest 这样更高级的框架,能有效提升编程效率。


nose2 vs pytest

如果你只想学习一个高级单元测试框架,建议你学 pytest, 而不是 nose2。

nose2 足够好,甚至看上去他的设计比 pytest 更加清晰,更容易理解。但是社区没有 pytest 活跃,因此使用的人也比较少。

实际上,nose2 和 pytest 的用法很多都是非常类似的,学习了一个,另外一个也能轻松上手。nose2 对于加深对测试框架的理解有很大的好处,建议python自动化测试工程师都了解下 nose2。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册