美文网首页测试性能搞起来
使用 nose 进行自动化测试

使用 nose 进行自动化测试

作者: 罗义的夏天 | 来源:发表于2016-12-02 11:56 被阅读721次

    作者:廖飞

    全文约 7778 字,读完可能需要 15 分钟。

    原文链接:http://www.cnblogs.com/liaofeifight/

    一、为什么使用 nose ?

    1. 编写测试更容易。

      nose 可以自动识别继承于 unittest.TestCase 的测试单元,并执行测试,而且, nose 也可以测试非继承于 unittest.TestCase 的测试单元。 nose 提供了丰富的 API 便于编写测试代码。

    2. 执行测试更容易。

      只要遵循一些简单的规则去组织你的类库和测试代码, nose 是可以自动识别单元测试的。执行测试是非常耗资源的,但是,一段第一个测试模块被加载后, nose 就开始执行测试。

    3. 建立测试环境更容易。

    4. 做你想做的事情更容易。

      nose 拥有很多内置的插件帮助进行输出抓取、错误查找、代码覆盖、文档测试( doctest )等等。同样,如果你不喜欢这些内置插件提供的功能或者这些插件不能满足你的项目结构,你可以自定义开发插件来完成你想要做的事情。

    二、基本使用

    安装: pip install  nose

    脚本命令:

    nosetests [options]  [( optional) test files  or directories]

    除了使用命令行这种方式之外,还可以在根目录下放置配置文件,配置文件的类型为 .noserc 或 nose.cfg 文件。配置文件都是标准的 ini 内容格式。例如:

    三、扩展使用

    nose 自动收集单元测试,收集它当前工作目录下的源代码文件、目录以及包。任何的源代码文件、目录或者包只要匹配正则表达式,他们就会被自动收集。包的测试收集按照树的层级级别一级一级进行,因此 package.tests 、 package.sub.tests 、 package.sub.sub2.tests 将会被收集。

    匹配成功的包、任何 python 的源文件都会当做测试用例。

    3.1 选择测试用例

    将需要测试的名称传递给 nose 的命令行。格式如下:

    nosetests only_test_this.py

    测试的名称可以是脚本文件的名称或者模块的名称,也可以使用 colon 表达式表达的测试名称。路径可以是相对的路径也可以是绝对的路径。如下所示:

    同样可以使用—— w 开关来切换当前的工作路径,从而改变 nose 查找测试用例的根路径。用法如下:

    nosetests -w /path/to/tests

    更多关于自定义测试用例的收集与加载方式,可以使用插件的方式做到。

    3.2 配置

    除了3.1通过脚本命令传递参数的方式外,你还可以在根目录下通过设置 setup.cfg 或者 .noserc 或者 nose.cfg 等配置文件达到同样的目的。例如:

    所有查找到的配置文件将会被加载,而且配置项的值会合并。如果想覆盖标准的配置文件,使用—— c 选项。

    3.3 使用插件

    使用 pip 安装所需要的插件,然后通过 nosetests 命令行配置插件。执行如下命令验证所安装的插件:

    nosetests - plugins

    在命令行中添加 -v 或者 -vv 选项可以显示每一个插件的更多信息。 如果通过 nose.main() 或者 nose.run() 执行测试,可以将要使用的插件关键字参数的列表传递进去。

    3.4 配置选项

    • V ,— version

    输出 nose 的版本

    • p ,— plugins

    输出可获取的插件列表。

    • v = DEFUALT ,— verbose = DEFAULT

    使用更多的 verbose

    — verbosity = VERBOSITY

    设置 verbosity ;— verbosity =2与—— v 设置一致

    • q ,— quiet = DEFAULT

    使用更少的 verbose

    • c = FILES ,— config = FILES

    设置配置文件。可以设置很多次,然后将所有的配置文件合并。

    • w = WHERE ,— where = WHERE

    设置查找的根目录。

    • py 3 where = WHERE

    顾名思义,针对 python 3. x 以上设置查找路径。

    • m = REGEX ,— match = REGEX ,— testmatch = REGEX

    设置用于自动化收集用例的正则表达式。

    — tests = NAMES

    执行这些测试。

    — debug - log = FILE

    设置调试的日志文件路径。

    — logging - config = FILE ,— log - config = FILE

    设置日志文件的配置文件。

    • I = REGEX ,— ignore - files = REGEX

    设置自动收集测试用例时忽略的正则表达式。

    • e = REGEX ,— exclude = REGEX

    排除要执行的测试用例的正则表达式

    • i = REGEX ,— include = REGEX

    包含要执行的测试用例的正则表达式

    • x ,— stop

    执行测试发生错误后,停止执行测试。

    — noexe

    不查找可以执行文件。

    • a = ATTR ,— attr = ATTR

    只执行包含 ATTR 属性的测试用例。

    • A = EXPR ,— eval - attr = EXPR

    只执行属性与 EXPR 匹配的测试用例。

    • s ,— nocapture

    不抓取标准输出 \ ( stdout\ )

    — nologcapture

    禁止使用日志插件

    — logging - format = FORMAT

    打印语句的自定义格式

    — logging - datefmt = FORMAT

    日志的日期时间格式

    — logging - filter = FILTER

    日志语句的过滤器。

    — logging - clear - handlers

    清除日志的其他 handlers

    — logging - level = DEFUALT

    设置日志的等级

    — with - coverage

    开启 coverage 插件

    — cover - package = PACKAGE

    限定 coverage 所在包

    — cover - erase

    在执行之前 清除上次 coverage 统计结果

    — cover - testes

    在 coverage 报告中包含测试模块

    — cover - html

    产生 html 的 coverage 报告

    — cover - html - dir = DIR

    设置存储 html 的目录

    — cover - xml

    产生 xml 的 coverage 报告

    — cover - xml - file = FILE

    设置存储 coverage 报告的 xml 文件

    — cover - config - file = DEFUALT

    设置 coverage 的配置文件

    • pdb

    当测试失败或产生错误是进入调试模式

    — pdb - failures

    当测试失败时进入调试模式

    — pdb - errors

    当测试产生错误时进入调试模式

    — with - doctest

    开启 doctest 插件

    — doctest - tests

    在测试模块中查询 doctests

    — with - profile

    开启 profile 插件

    — profile - sort = SORT

    设置 profiler 输出排序

    — profile - stats - file = FILE

    设置统计所在的文件地址

    — with - id

    开启 TestId 插件

    — processes = NUM

    开始测试处理器的个数

    — processes - timeout = SECONDS

    设置超时时间。

    — with - xuint

    开始 Xunit 插件

    — xuint - file = FILE

    设置 XUnit 报告所在的 xml 文件

    — all - modules

    开启 AllModules 插件

    — collect - only

    开启只收集测试功能。只收集测试用例及输出测试名字,而不执行测试

    四、编写测试用例

    4.1 项目组织结构

    由于 nose 是自动收集测试用例的,只有 nose 执行的测试目录下的源代码文件、包名、子目录名跟正则表达式匹配成功后,才能被收集。而且代码是树级层次显示的话, nose 会逐级向下查找子目录下的匹配的测试用例。

    匹配的正则表达式默认值为: ( (?: ^ | [\b_\. - ] ) [Tt]est. 所以最好是以 Test 开头,或者 test 开头。当然也可以修改默认的匹配的正则表达式。

    所以,推荐的项目结构为:

    为项目单独建一个 test 包,里面按项目模块分子包,最后以及为 "test_" 开头的测试用例源文件。

    4.2 测试结果

    4.3测试代码

    test_mymath.py 中的代码如下:

    # -*- coding: utf-8 -*-

    __author__ = 'Administrator'

    from nose.tools import assert_equal

    from nose.tools import with_setup

    import  unittest

    import mymath.math as mmath

    def setUp():    

        print("============test math module setup==============")


    def
    teardown():    

        print("============test math module teardown==============")


    def
    test_math_add():

        result=mmath.add(4, 5)    

        print("================test_math_add============")

       assert_equal(10, result)

    class test_math3():    

        def setUp(self):        

            print("============test math class setup==============")
        
    def teardown(self):        

            print("============test math class teardown==============")    

        def test_math_square(self):        

            print("=============== test_math_square================ ")

           assert_equal(9, mmath.square(3))    

        def test_math_sub(self):        

            print("=============== test_math_sub================ ")

           assert_equal(1, mmath.sub(3, 2))

    class test_math2(unittest.TestCase):    

        def test_math_multipy(self):        

            print("=============== test_math_multipy================ ")

           assert_equal(8, mmath.multiply(2, 4))

    test_logicOper.py 中的代码如下:

    4.4 测试分析

    (1)测试用例的收集

    由于 nose 是按照正则表达式自动收集匹配的测试用例。我们这里收集了5个测试用例。分别了

    • test_mymath.py 模块里的 test_math_add 函数。

    • test_mymath.py 模块里的 test_math 3类下面的 test_math_square 、 test_math_sub 两个函数。

    • test_mymath.py 模块里的 test_math 2类下面的 test_math_multipy 函数。

    • test_logicOper.py 模块里的 test_logicOper_isGreaterThan 函数。

    (2)测试的运行顺序。

    从下图打印输出的结果可以看出。收集的测试用例的执行顺序:

    test_logicOper_isGreaterThan—>test_mymath(模块).setup—>test_math2(类).test_math_multipy—>test_math3(类).setup—>test_math3(类).test_math_square—> test_math3(类).teardown—>test_math3(类).setup—>test_math3(类).test_math_sub—>test_math3(类).teardown—>test_mymath(模块).test_math_add—>test_mymath(模块).teardown.

    大体可以得出如下结论:

    1)测试的顺序总体上按照包—>模块—>类的顺序进行;

    2) 然后按照测试用例名称的升序排序进行,比如test_math_multipy比test_math_square先执行;

    3)当测试模块中既包含测试函数,又包含测试类时,都一定是先执行setup(如果定义了),模块测试执行完毕后执行teardown(如果定义了)。而且模块的setup、setdown只执行一次。

    4)测试类中的每个测试方法执行前先执行setup(如果定义了),执行完毕后执行teardown(如果定义了)。而且每个测试方法的执行过程都是如此,新的方法重新按setup—>执行方法—>teardown的顺序执行

    (3)关于 setup 、 teardown

    package 、 module 、 class 都可以设置 setup 、 teardown 。

    1) package 的 setup 、 teardown 的设置

    放在 __init__.py 文件中,在整个测试的运行期间只运行一次。

    setup 函数的取名可以是 setup , setup_package , setUp , setUpPackage 中的一个。

    teardown 函数取名可以是 teardown , teardown_package , tearDown or  tearDownPackage 中的一个。

    2) module 的 setup 、 teardown 的设置

    在整个测试的运行期间只运行一次。

    setup 函数的取名可以是 setup , setup_module , setUp or  setUpModule 中的一个。

    teardown 函数取名可以是 teardown_module , or tearDownModule 中的一个。

    3) class 的 setup 、 teardown 的设置

    每个测试方法执行时都会调用。

    setup 函数的取名可以是 setup_class , setupClass , setUpClass , setupAll , setUpAll 中的一个。

    teardown 函数取名可以是 teardown_class , teardownClass , tearDownClass , teardownAll
    , tearDownAll 中的一个。

    测试类可以继承 unittest.TestCase ,也可以不继承, nose 都能识别。

    4)测试方法的 setup 、 teardown

    可以通过 with_setup 装饰器进行设置,比如

    总之, nose 的口号是: nose extends  unittest to  make testing  easier (测试更简单  ).


    点击阅读原文,查看更多 Python 教程和资源


    阅读原文:http://mp.weixin.qq.com/s?timestamp=1480650997&src=3&ver=1&signature=rAz8xPmr3gir4SClxdIaYaU9jeefMzjQI9GdwDxmonAAP1Eoea3cA91rWu5aMV15KGFJ3H6fNGnWtw-r0F4SUk6atzeq0qBnYmqNC41VuNjwtEX1VMfmlM6P8ITdXP3vCF86PaA8zGXvFu3ncWTd18AyU-*2s3PXarERbqg8pxg=

    相关文章

      网友评论

      • 洛奇洛:nose如何与htmltestrunner配合使用 将所有的测试结果整合在一个报告里生成??

      本文标题:使用 nose 进行自动化测试

      本文链接:https://www.haomeiwen.com/subject/ajafmttx.html