pytest测试实战

pytest,能更好地完成测试,却只需要更少的代码。

pytest主要用于单元测试与功能测试,而本书的内容涵盖了它的基本用法,足以满足工程需要。结合优秀库的setup.pysetup.cfg文件,就能掌握工程的打包要诀。至于扩展pytest,则需要深入阅读文档与源码。

从使用层面上看,pytest主要由cliassertmarkfixtruehook等部分构成。

  • cli,提供了用例定位、格式化输出等功能。

  • pytest重写了assert关键字,不仅提升了易用性,而且还能输出更详细的错误信息。

  • mark,不仅能对用例进行分类,还可参数化测试。

  • fixtrue,作为一种依赖注入,解耦了测试的配置和逻辑,是pytest的核心。

  • hook,不仅将各个模块组合起来,还给用户留出了扩展接口。

从运行层面上看,pytest先读取配置信息,加载测试目录,将测试用例映射成节点并从下至上链接成树;然后运行测试循环,迭代测试用例,完成setup/call/teardown;最后汇总测试结果,生出测试报告。

从源代码层面上看,pytest由一个入口文件pytest.py和一个组件包_pytest构成。

  • assertion组件重写了assert关键字;

  • Config类组合了一个PytestPluginManager类的实例,这个类是pluggy模块中PluginManager类的子类,从而实现了hook

  • nodes.py文件中的节点类Nodeproperty装饰了两个属性nodeidihookihook作为代理接口,用于把用例接入整个测试系统。

  • pytest.markMarkGenerator类的一个实例,从而实现了所谓的“单例模式”。通过类属性_config的布尔值,来判定是否拦截未注册的标记。__getattr__方法返回一个被attr模块的attrs函数装饰过的MarkDecorator类的实例,这个类的__call__方法很有意思——如果传入除用例以外的参数,那么将再返回一个MarkDecorator类的实例。

  • pytest.fixtrue函数返回一个FixtureFunctionMarker类的实例。FixtureRequest从用例节点中获取参数名,并转换为对应的FixtureDef,而它的子类SubRequest则由下至上地查找出所有的依赖项。