• Module-Nosetests单元测试


    Python-单元测试 Nosetests

    单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。
    unittest 是Python必备的一个单元测试框架。

    TODO https://www.bbsmax.com/A/x9J2j0yWJ6/

    Noestests介绍

    nostests优点:

    • 编写测试更容易。nose可以自动识别继承于unittest.TestCase的测试单元,并执行测试,而且,nose也可以测试非继承于unittest.TestCase的测试单元。nose提供了丰富的API便于编写测试代码。
    • 执行测试更容易。 只要遵循一些简单的规则去组织你的类库和测试代码,nose是可以自动识别单元测试的。执行测试是非常耗资源的,但是,一段第一个测试模块被加载后,nose就开始执行测试。
    • 建立测试环境更容易。
    • 做你想做的事情更容易。 nose拥有很多内置的插件帮助进行暑输出抓取、错误查找、代码覆盖、文档测试(doctest)等等。同样,如果你不喜欢这些内置插件提供的功能或者这些插件不能满足你的项目结构,你可以自定义开发插件来完成你想要做的事情。

    unittest核心工作原理

    unittest中最核心的四个概念

    • test case: 测试用例。一个完整的测试流程。
    • test suite: 多个测试用例集合。带有顺序性
    • test runner: 执行测试用例
    • test fixture: 负责测试环境的创建和销毁

    unittest关键类说明

    • TestCase 也就是测试用例
    • TestSuite 多个测试用例集合在一起,就是TestSuite
    • TestLoader是用来加载TestCase到TestSuite中的
    • TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0kJAHay2-1580610890748)(https://github.com/fansichao/awesome-it/raw/master/images/Linux-Nosetests02静态类图.png)]

    Noestest使用

    安装部署

    pip install nose
    

    插件

    TODO 如何配置插件

    使用pip安装所需要的插件,然后通过nosetests命令行配置插件。
    如果通过nose.main()或者nose.run()执行测试,可以将要使用的插件关键字参数的列表传递进去

    # 显示已安装插件
    nosetests --plugins
    # -v 显示插件详细信息
    
    (env) [scfan@scfan project]$  nosetests --plugins -v
    Plugin capture
      score: 1600
      Output capture plugin. Enabled by default. Disable with ``-s`` or
      ``--nocapture``. This plugin captures stdout during test execution,
      appending any output captured to the error or failure output, should
      the test fail or raise an error.
    
    Plugin failuredetail
      score: 1600
      Plugin that provides extra information in tracebacks of test
      failures.
    
    Plugin xunit
      score: 1500
      This plugin provides test results in the standard XUnit XML format.
    
    Plugin deprecated
      score: 1000
      Installs a DEPRECATED error class for the DeprecatedTest exception.
      Enabled by default.
    
    Plugin skip
      score: 1000
      Plugin that installs a SKIP error class for the SkipTest exception.
      When SkipTest is raised, the exception will be logged in the skipped
      attribute of the result, 'S' or 'SKIP' (verbose) will be output, and
      the exception will not be counted as an error or failure.
    
    Plugin multiprocess
      score: 1000
      Run tests in multiple processes. Requires processing module.
    
    Plugin logcapture
      score: 500
      Log capture plugin. Enabled by default. Disable with --nologcapture.
      This plugin captures logging statements issued during test
      execution, appending any output captured to the error or failure
      output, should the test fail or raise an error.
    
    Plugin coverage
      score: 200
      Activate a coverage report using Ned Batchelder's coverage module.
    .....
    

    nosetests参数

    -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
    
      开启只收集测试功能。只收集测试用例及输出测试名字,而不执行测试
    

    Nosetests语法说明

    TODO 详细说明

    扩展 nose-printlog

    可以在控制台输出日志,也可以将日志显示在caplog中

    # 安装插件
    pip install nose-printlog
    # 运行命令样例
    nosetests -sv  test_data_load.py   --logging-format="%(asctime)s:%(name)s:%(levelname)s: %(message)s"  --with-printlog
    

    附件

    用HTMLTestRunner输出漂亮的HTML报告

    参考链接:CSDN博客unittest单元测试

    tools_unittest_HTMLTestRunner.py
    下载链接

    测试代码

    tools_mathfunc.py

    (env) [scfan@WOM tools]$ cat tools_mathfunc.py
    #! -*- coding:utf-8 -*-
    u"""
        常见数学类函数
    
    - add
    - minux
    - divide
    - multi
    
    """
    
    def add(x,y):
        return x+y
    
    def minus(x,y):
        return x-y
    
    def divide(x,y):
        return x/y
    
    def multi(x,y):
        return x * y
    

    test_unittest_htmlreport.py

    # coding=utf-8
    u"""
        单元测试unittest 生成HTML报告测试
    
    运行命令:
    cd /home/scfan/pro/server && python -m  pro.tests.test_unittest_htmlreport
    
    """
    import unittest
    from ..tools.tools_unittest_HTMLTestRunner import HTMLTestRunner
    from ..tools.tools_mathfunc import *
    
    class TestMathFunc(unittest.TestCase):
    
        def test_add(self):
            self.assertEqual(3, add(1, 2))
            self.assertNotEqual(3, add(2, 2))
    
        def test_minus(self):
            self.assertEqual(1, minus(3, 2))
    
        def test_multi(self):
            self.assertEqual(6, multi(3, 2))
    
        def test_divide(self):
            self.assertEqual(2, divide(6, 3))
            self.assertEqual(2.5, divide(5, 2))
    
    if __name__ == '__main__':
        suite = unittest.TestSuite()
    
        tests = [TestMathFunc("test_add"), TestMathFunc("test_minus"), TestMathFunc("test_divide")]
        suite.addTests(tests)
    
        with open('HTMLReport.html', 'w') as f:
            runner = HTMLTestRunner(stream=f,
                                    title = 'MathFunc Test Report',
                                    description='generated by HTMLTestRunner.',
                                    verbosity=2
                                    )
            runner.run(suite)
    

    参考资源

    参考链接:

    扩展:

  • 相关阅读:
    学习进度条第一周
    构建之法阅读笔记01
    软件工程个人作业01
    《构建之法》阅读笔记
    Day6:闭包函数、无参装饰器
    Day5:函数参数
    Day4:字符编码与文件处理
    Day3:数据类型(布尔值、集合)
    Day2:数据类型(列表、元组、字典)
    Day1:初识Python
  • 原文地址:https://www.cnblogs.com/superscfan/p/12256955.html
Copyright © 2020-2023  润新知