pytest,能更好地完成测试,却只需要更少的代码。
pytest主要用于单元测试与功能测试,而本书的内容涵盖了它的基本用法,足以满足工程需要。结合优秀库的setup.py、setup.cfg文件,就能掌握工程的打包要诀。至于扩展pytest,则需要深入阅读文档与源码。
从使用层面上看,pytest主要由cli、assert 、mark、fixtrue、hook等部分构成。
从运行层面上看,pytest先读取配置信息,加载测试目录,将测试用例映射成节点并从下至上链接成树;然后运行测试循环,迭代测试用例,完成setup/call/teardown;最后汇总测试结果,生出测试报告。
从源代码层面上看,pytest由一个入口文件pytest.py和一个组件包_pytest构成。
assertion组件重写了assert关键字;
Config类组合了一个PytestPluginManager类的实例,这个类是pluggy模块中PluginManager类的子类,从而实现了hook。
nodes.py文件中的节点类Node用property装饰了两个属性nodeid、ihook。ihook作为代理接口,用于把用例接入整个测试系统。
pytest.mark是MarkGenerator类的一个实例,从而实现了所谓的“单例模式”。通过类属性_config的布尔值,来判定是否拦截未注册的标记。__getattr__方法返回一个被attr模块的attrs函数装饰过的MarkDecorator类的实例,这个类的__call__方法很有意思——如果传入除用例以外的参数,那么将再返回一个MarkDecorator类的实例。
pytest.fixtrue函数返回一个FixtureFunctionMarker类的实例。FixtureRequest从用例节点中获取参数名,并转换为对应的FixtureDef,而它的子类SubRequest则由下至上地查找出所有的依赖项。