各位小伙伴,大家好啊,最近小编我一直在搜狗手机助手项目组进行测试手段改进相关的工作,其中一项改进就是开展服务端的测试,而服务端的改进首先从接口测试开始,下面针对实施的过程与大家分享一下。
当前存在的问题:
- 测试范围:目前测试工作的重点是在Android客户端,对于服务端测试的投入很少,这样对于质量保证工作来讲是存在质量隐患的;
- 测试手段:针对服务端接口的测试,目前使用的手段是。对客户端进行不同的操作,通过观察客户端不同的响应效果,来判断服务端逻辑的正确与否;
- 测试深度:目前的测试层次维持在接口表层,仅为入口级别,对于接口内部的深层逻辑,无法有效验证;
- 测试度量:针对服务端测试质量的度量,仅为接口功能需求层面,对于代码层面的度量,目前是没有的,所以无法评估测试的质量是否符合要求。
实施过程
首先我们制定的是目标,在这次改进工作中,我们期望所能到达到的效果是:
- 极高的自动化程度
- 极低的人工成本
- 极好的测试效果
在这个目标中,体现出的了3个关键词,分别是 “自动化” 、“可度量”、“高效率”。
所以我们制定了一套系统性的服务端接口测试质量度量实施计划,分别包括以下三部分:
- 测试环境自动部署;
- 测试用例自动执行;
- 结果统计与报告自动输出。
测试环境自动部署
我们目前所使用的测试环境均为开发提供的,测试对于该服务器无任何操作权限,限制了我们工作的展开,所以我们独立搭建了一套测试环境。
- 测试服务器的自动部署
我们后端工程环境是这样的:
- 系统环境:CentOS7.2 Nginx1.16.0 PHP7.3.6
- 开发语言:PHP
- 开发使用的框架:SuperPHP MySql Redis memcache mcrypt
根据代码工程的部署步骤,我们通过shell脚本实现了自动化操作。
- 代码覆盖率统计程序的自动部署
在测试质量度量方面,我们引入了“代码覆盖率”这样一个指标项,统计脚本的运行环境需要:
- Xdebug
- php-code-coverage
- composer
1) 安装并配置Xdubug
代码语言:javascript复制git clone git://github.com/xdebug/xdebug.git
cd xdebug
find / -name phpize
/usr/bin/phpize
find / -name php-config
./configure --enable-xdebug --with-php-config=/usr/local/php/bin/php-config
make
make install
2)配置php-code-coverage库
- 下载并安装composer
curl -sS https://getcomposer.org/installer | php
php composer.phar --version
Composer version 1.6.5 2018-05-04 11:44:59
- 将 composer.phar 放到工程根目录下
- 新建composer.json文件
# composer.json
{
"require": {
"phpunit/php-code-coverage": "^7.0",
"ext-dom": "*",
"ext-xmlwriter": "*",
"phpunit/php-file-iterator": "^2.0.2",
"phpunit/php-token-stream": "^3.0.1",
"phpunit/php-text-template": "^1.2.1",
"sebastian/code-unit-reverse-lookup": "^1.0.1",
"sebastian/environment": "^4.1",
"sebastian/version": "^2.0.1",
"theseer/tokenizer": "^1.1",
"phpunit/phpunit": "^8.0",
"phpunit/phpcov": "*"
}
}
运行以下命令,安装第三方库,会在同级目录中生成vendor目录
代码语言:javascript复制php composer.phar install
3)插桩
这里的插桩操作非常简单,仅需要两个步骤:
- 新建一个用来统计覆盖率的脚本,名称prepend.php;
<?php
require_once dirname(__FILE__).'/vendor/autoload.php'; # 在composer生成的vender同级目录。
use SebastianBergmannCodeCoverageCodeCoverage;
$coverage = new CodeCoverage;
$coverage->filter()->addDirectoryToWhitelist('/xxxxx/index.php'); # 白名单,即需要统计的工程文件或文件夹。
$coverage->start('<Site coverage>');#开始统计
register_shutdown_function('__coverage_stop',$coverage);#注册关闭方法
function __coverage_stop(CodeCoverage $coverage){
$coverage->stop();#停止统计
$cov = '<?php return unserialize(' . var_export(serialize($coverage), true) . ');';#获取覆盖结果,注意使用了反序列化
//echo $cov;
file_put_contents('/usr/local/nginx/html/report/cov/site.' . date('U') .'.'.uniqid(). '.cov', $cov);#将结果写入到文件中
}
- 将该脚本插入到需要统计的功能代码中
include_once("/xxxx/prepend.php");
1)统计部分接口,可以在每个需要统计的接口函数中插入; 2)统计整个工程,可以在工程入口函数中插入。
至此测试所需要的环境已部署完成。
测试用例自动执行
由于目前的测试手段为接口测试,而市面上的接口测试工具、开源框架有很多,如Postman、soupUI、httprunner等等,所以大家可以根据具体情况自由选择。
我们团队的接口测试自动化执行采用了以下两种形式。 1)团队自建的接口自动化平台,大部分的通用接口,均可以使用该平台进行测试; 2)团队自建的接口自动化框架,某些复杂逻辑的接口测试,在平台无法搞定的情况下使用。
结果统计与报告自动输出
我们目前的报告主要包括接口测试执行结果报告、代码覆盖度统计报告。
- 接口测试执行结果报告
- 代码覆盖度统计报告
phpcov merge --html="/usr/local/nginx/html/report/coverageInfo/coverage_html" coverageInfo/ -vvv
自动化串联
以上的实施过程中,每个环节可以做到自动化操作,但是为了达到我们的目标,实现高度的自动化和极低的人工成本,当前的状态是完全不够的,所以我们又引入了Jenkins。通过Jenkins,我们实现了完全自动化,从代码拉取到产出报告,总时长仅为7.6秒。
写在后面的话
以上是我们在服务端测试覆盖度提升方面的尝试,在这个尝试中目前仍然存在一些问题,包括接口测试用例数量少、代码行覆盖度低的情况,这些都是需要我们在后期不断地改进。也希望各位小伙伴多多给我们提些改进建议,我们在这里一起交流。