pytest(Chapter 2)

二、第二章

     2.1通过python -m pytest调用pytest ----- 调用方式后期完善其他调用
         这是在2.0版本中新引入的功能。 
         
         你可以通过python的解释器,利用命令行来调用测试:
         
             python ‐m pytest [...]
             
         这种调用方式几乎等同于直接调用pytest […],但需要注意的是这种通过python来调用的方式同时会
         将当前目录添加到sys.path
         
         
     2.2退出码
         pytest有以下6种退出码:
             Exit code 0: 找到所有测试用例并测试通过
             Exit code 1: 找到测试用例并运行但是部分测试用例运行失败
             Exit code 2: 用户中断了测试
             Exit code 3: 执行过程中发生了内部错误
             Exit code 4: pytest命令行使用错误
             Exit code 5: 没有找到任何测试用例
             
     2.3 版本信息,参数名,环境变量的帮助
     
         pytest ‐‐version #显示pytest的import的路径
         pytest ‐‐fixtures #显示内置的函数参数
         pytest ‐h | ‐‐help #帮助信息
         
         
     2.4 第一(N)次测试失败后停止
         使用下面的参数可以让测试在第1(N)次测试失败后停止:
         
             pytest ‐x # 第一次测试失败后停止测试
             pytest ‐‐maxfail=2 # 第2次测试失败后停止测试
             
     2.5指定/选择测试用例
         Pytest在命令行中支持多种方式来运行和选择测试用例:
         对模块中进行测试:
             pytest test_mod.py
         对文件夹中进行测试:
             pytest testing/
         通过关键字表达式来进行测试:
             pytest ‐k "MyClass and not method"
         这种方式会执行文件名,类名以及函数名与给定的字符串表达式相匹配的测试用例。 上面的用例会执
         行TestMyClass.test_something但是不会执行TestMyClass.test_method_simple
         and not 在这里是表达式,未经过测试
         通过节点id来进行测试
         每个被选中的测试用例都会被分配一个唯一的nodeid,它由模块文件名和以下说明符组成:参数化的
         类名、函数名和参数,用::分隔。
         可以通过下面的方式运行模块中的指定的测试用例:
             pytest test_mod.py::test_func
         也可以通过下面这种方式:
         pytest test_mod.py::TestClass::test_method
         通过标记符来进行测试
         pytest ‐m slow
         这种方式会运行所有通过装饰器 @pytest.mark.slow进行装饰的测试用例。
         关于标记符请参考marks
         通过包来运行
         pytest ‐‐pyargs pkg.testing
         这种方式会导入pkg.testing,并且基于该包所在为止来查找并运行测试用例。
         
     2.6详尽的测试报告

         参数**-r**可以用来在测试结束后展示一份“测试概要信息”,这使得在大型测试套中获取一份清楚
         的测试结果(失败,跳过等测试信息)十分简单。
         示例:
         #test_example.py的内容
         import pytest
         @pytest.fixture
         def error_fixture():
         assert 0
         def test_ok():
          print("ok")
         def test_fail():
         assert 0
         def test_error(error_fixture):
          pass
         def test_skip():
         pytest.skip("skipping this test")
         def test_xfail():
         pytest.xfail("xfailing this test")
         @pytest.mark.xfail(reason="always xfail")
         def test_xpass():
         pass
          C:\>pytest ‐ra
          
          
     2.7 测试失败时自动调用PDB
         pytest允许通过命令行使能在测试失败时自动调用python的内置调试工具PDB:
             pytest ‐‐pdb
         这会在每次测试失败(或者发生KeyboardInterrupt)的时候都去调用PDB。通常我们可能只需要在第
         一次测试失败的时候来调用pdb:
             pytest ‐x ‐‐pdb       #首次失败的时候调用pdb,然后结束测试进程
              pytest ‐‐pdb ‐‐maxfail=3    #前三次失败的时候调用pdb
              
         注意所有的异常信息都会保存在sys.last_value, sys.last_type和sys.last_traceback中。 在交互使用
         中,这允许使用任何调试工具进入后期调试。我们也可以手动的访问这些异常信息,如下:
         (Pdb) import sys
         (Pdb) sys.last_traceback.tb_lineno
         1448
         (Pdb) sys.last_value
         AssertionError('assert 0')
         (Pdb) sys.last_type
         <class 'AssertionError'>
         
         
     2.8 测试启动时调用PDB
         pytest允许在测试启动时立即调用pdb:
        pytest ‐‐trace
        这会在每个测试开始时立即调用python的pdb
        
        
     2.9 设置断点
         在代码中使用python的原生接口**python import pdb; pdb.set_trace()**来设置断点,在pytest中
         会自动禁用该测试的输出捕获:
         *其他测试的输出捕获不会受影响
         *先前的测试中已经被捕获的输出会被正常处理
         *同一测试中的后续输出不会被捕获,而被转发给sys.stdout。注意即使退出交互式pdb继续运行测
         试,这一设置依然生效
         
         
     2.10分析测试时间
             pytest.main()
         这和在命令行中使用pytest是一样的, 这种方式不会抛出SystemExit异常,而会返回exitcode, 通
         过如下方式可以传入调用参数:
             pytest.main(['‐x', 'mytestdir'])
         你可以在pytest.main中指定额外的插件:
         # myinvoke.py的内容
             import pytest
             class MyPlugin(object):
                 def pytest_sessionfinish(self):
                     print("*** test run reporting finishing")
             pytest.main(["‐qq"], plugins=[MyPlugin()])
             
         运行代码就可以发现MyPlugin被添加到hook里并被调用:
         C:\>python myinvoke.py

         **注意:**调用pytest.main()会导入你的测试用例及其所引用的所有的模块。因为python存在模块导
         入的缓存机制,如果多次调用pytest.main(),后续的调用也不会再刷新这些导入的资源。因此,不建
         议再同一进程中多次调用pytest.main() (比如重新运行测试).
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容