51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4323|回复: 0
打印 上一主题 下一主题

[转贴] 使用nose进行python自动化测试

[复制链接]
  • TA的每日心情
    无聊
    11 小时前
  • 签到天数: 1052 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-7-2 09:45:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    一、为什么使用nose?
      编写测试更容易。 nose可以自动识别继承于unittest.TestCase的测试单元,并执行测试,而且,nose也可以测试非继承于unittest.TestCase的测试单元。nose提供了丰富的API便于编写测试代码。
      执行测试更容易。 只要遵循一些简单的规则去组织你的类库和测试代码,nose是可以自动识别单元测试的。执行测试是非常耗资源的,但是,一段第一个测试模块被加载后,nose就开始执行测试。
      建立测试环境更容易。
      做你想做的事情更容易。 nose拥有很多内置的插件帮助进行暑输出抓取、错误查找、代码覆盖、文档测试(doctest)等等。同样,如果你不喜欢这些内置插件提供的功能或者这些插件不能满足你的项目结构,你可以自定义开发插件来完成你想要做的事情。

      二、基本使用
      安装:pip install nose
      脚本命令:
    1.  nosetests [options] [(optional) test files or directories]
    复制代码
    除了使用命令行这种方式之外,还可以在根目录下放置配置文件,配置文件的类型为.noserc或nose.cfg文件。配置文件都是标准的ini内容格式。例如:
    1.  [nosetests]
    2.   verbosity=3
    3.   with-doctest=1
    复制代码
    三、扩展使用
      nose自动收集单元测试,收集它当前工作目录下的源代码文件、目录以及包。任何的源代码文件、目录或者包只要匹配正则表达式,他们就会被自动收集。包的测试收集按照树的层级级别一级一级进行,因此package.tests、package.sub.tests、package.sub.sub2.tests将会被收集。
      匹配成功的包、任何python的源文件都会当做测试用例。

      3.1 选择测试用例
      将需要 测试的名称 传递给nose的命令行。格式如下:
      nosetests only_test_this.py
      测试的名称 可以是脚本文件的名称或者模块的名称,也可以使用colon表达式表达的测试名称。路径可以是相对的路径也可以是绝对的路径。如下所示:
    1. nosetests test.module
    2.   nosetests another.test:TestCase.test_method
    3.   nosetests a.test:TestCase
    4.   nosetests /path/to/test/file.py:test_function
    复制代码
    同样可以使用-w开关来切换当前的工作路径,从而改变nose查找测试用例的根路径。用法如下:
    1. nosetests -w /path/to/tests
    复制代码
    更多关于自定义测试用例的收集与加载方式,可以使用插件的方式做到。

      3.2 配置
      除了3.1通过脚本命令传递参数的方式外,你还可以在根目录下通过设置setup.cfg或者.noserc或者nose.cfg等配置文件达到同样的目的。例如:
    1. [nosetests]
    2.   verbosity=3
    3.   with-doctest=1
    复制代码
    所有查找到的配置文件将会被加载,而且配置项的值会合并。如果想覆盖标准的配置文件,使用-c选项。

      3.3 使用插件
      使用pip安装所需要的插件,然后通过nosetests命令行配置插件。执行如下命令验证所安装的插件:
    1. 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
      设置查找的根目录。
      -py3where=WHERE
      顾名思义,针对python3.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中的代码如下:
    1. # -*- coding: utf-8 -*-
    2.   __author__ = 'Administrator'
    3.   from nose.tools import assert_equal
    4.   from nose.tools import with_setup
    5.   import  unittest
    6.   import mymath.math as mmath
    7.   def setUp():
    8.   print("============test math module setup==============")
    9.   def teardown():
    10.   print("============test math module teardown==============")
    11.   def test_math_add():
    12.   result=mmath.add(4, 5)
    13.   print("================test_math_add============")
    14.   assert_equal(10, result)
    15.   class test_math3():
    16.   def setUp(self):
    17.   print("============test math class setup==============")
    18.   def teardown(self):
    19.   print("============test math class teardown==============")
    20.   def test_math_square(self):
    21.   print("=============== test_math_square================ ")
    22.   assert_equal(9, mmath.square(3))
    23.   def test_math_sub(self):
    24.   print("=============== test_math_sub================ ")
    25.   assert_equal(1, mmath.sub(3, 2))
    26.   class test_math2(unittest.TestCase):
    27.   def test_math_multipy(self):
    28.   print("=============== test_math_multipy================ ")
    29.   assert_equal(8, mmath.multiply(2, 4))
    复制代码
     test_logicOper.py 中的代码如下:
    1.  # -*- coding: utf-8 -*-
    2.   __author__ = 'Administrator'
    3.   from nose.tools import assert_equal
    4.   from  logicOperator.localOperator import  *
    5.   def test_logicOper_isGreaterThan():
    6.   print("=================test_logicOper_isGreaterThan============")
    7.   result=isGreaterThan(4,3)
    8.   assert_equal(True,result)
    复制代码
    4.4 测试分析
      (1)测试用例的收集
      由于nose是按照正则表达式自动收集匹配的测试用例。我们这里收集了5个测试用例。分别了
      test_mymath.py模块里的test_math_add函数。
      test_mymath.py模块里的test_math3类下面的test_math_square、test_math_sub两个函数。
      test_mymath.py模块里的test_math2类下面的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 函数取名可以是t eardown , 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(测试更简单) 。










    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-27 21:22 , Processed in 0.063723 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表