自《PHPUnit-实现 API 接口的自动化测试》开始,我们在测试上面投入了不少精力,也有了些进展;目前正在使用 Python 进行 API 接口测试。
在测试时,总有些接口会依赖登录;目前 Python 的处理是将 cookie 记录到文件中,有时谈论起来,听口气也不是很方便;单元测试 用例的组织 也是一个问题;
最近 RPC Yar 引入后的问题 引导我们重新审视 PHPUnit,Peter 在 自底向上的 PHP 单元测试 中对 @dataProvider 的使用是一个好契机,说明我们对于单元测试的投入在增强;
- phpunit.de 官网;
- phpunit.cn 中文网;
本文主要谈一下如何处理登录依赖的问题;
测例的组织问题
- phpunit.xml 文件;
- phpunit 的 --testsuite 选项;
- phpunit 的 --filter 选项;
- @group 标注,--group,--exclude-group 选项;
为何登录要单独处理?
- 多个接口可以共享;
- 可以单独一个类,便于在多个类之间共享;
实现要点
- 源代码标注 @dataProvider
- Test Dependencies 从降低测试耦合性来看,不适合使用;或许使用的方法和场景不对;
phpunit.xml
- testsuites 指定目录;
<phpunit>
<testsuites>
<testsuite name="Application Test Suite">
<directory suffix="Test.php">./tests/v14</directory>
</testsuite>
</testsuites>
</phpunit>
phpunit 命令行选项和参数
- phpunit 执行当前目录下由 phpunit.xml 定义的所有 testsuites 符合条件的 test cases;
-
--filter <pattern>Filter which tests to run.
phpunit --filter 'testC35'表示只执行符合testC35正则表达式的测例;
要想只执行某一个测例,--filter就是一个好方法;在编写测例时,节省时间; -
--testsuite <pattern>Filter which testsuite to run.
可以指定执行 phpunit.xml 文件中定义的哪个 testsuit; -
phpunit <path>直接指定一个路径参数则执行该路径下所有 test cases; -
--configuration指定配置文件,默认当前目录下 phpunit.xml;
关于单元测试的一种观点
- 每个测例都是独立的,依赖性应当充分审慎;
- 由于测例是独立的,测例可以任何顺序执行;
- 每个测例应当初始化和销毁自己需要的一切;
最好的做法就是测例之间最好不要共享对象和状态; -
SOLID 的 SRP:Single Responsibility Principle;
Single responsibility
Open–closed
Liskov substitution
Interface segregation
Dependency inversion - 通常测例是按照由上到下执行的,@depends 也是这样的;
如果被依赖的测例没有执行或者执行失败,则主测例被跳过(skiped),所以 @depends 与顺序无关,不是用来解决顺序问题的; - 测例的独立性有助于缺陷定位(defect localization);
- XUnit Test Patterns;