最近也是工作上,要推进单元测试,才有想法了解一下相关东西~~忘记说了,这个是基于laravel的框架来做的~~
可能因为工作内容特殊的问题,我的这个单元测试主要测试的是api接口~~~做了个再挂一个gitlab的钩子,可以全面
我这个方案其实可以推进的不仅仅是单元测试,接口文档的完善也一并给做了。我的单元测试是基于swagger自动生成的。
swagger:还是相当强大的,可以通过注解自动生成接口文档,而且有ui界面可以查看和模拟请求结果。不了解的,可以先去了解下,非常强大~~~
主要思路:通过swagger json的接口list,来生成单元测试的代码~~其实蛮简单,可以自己看下~~colors类可以忽略,就是一个终端输出带颜色的类,就是为了看起舒服点。
其实这个配上gitlab,可以强制要求大家必须完善swagger的注释,这样接口文档也比较完善~~~有需要可以自己拿去改进~~
public function __construct()
{
parent::__construct();
$this->swaggerUrl = 'http://laravel.test.com/swagger/json';
}
/**
* 测试用例入口
*/
public function testSwaggerList()
{
error_reporting(E_ALL | E_STRICT);
$request = Request::get($this->swaggerUrl)->send();
$api_list = json_decode( json_encode( $request->body),true);
foreach ($api_list['paths'] as $key=>$v){
$api_url = $key;
$param = array();
//组织参数
$v['post']['parameters'] = $v['post']['parameters'] ?? array();
$v['get']['parameters'] = $v['get']['parameters'] ?? array();
$parameters = empty($v['post']['parameters']) ? $v['get']['parameters'] : $v['post']['parameters'];
foreach ($parameters as $v){
$v['required'] = $v['required'] ?? false;
$v['default'] = $v['default'] ?? '';
$param[$v['name']] = $this->setValue($v['type'],$v['required'],$v['default'],$v['name']);
}
$colors = new Colors();
echo $colors->getColoredString("\n start test 接口名称".$api_url."~~参数:".json_encode($param), "purple", "green");
if (empty($v['post'])){
$response = $this->get($api_url.'?'.http_build_query($param));
} else {
$response = $this->post($api_url,$param);
}
$response->assertStatus(200)->assertJson(array('code'=>200));
echo $colors->getColoredString("...............【success】", "purple", "green");
}
}
/**
* 返回接口参数
* @param string $type 参数类型
* @param bool $required 是否必填字段
* @param string $default 默认值
* @return String/Inter
*/
private function setValue($type, $required, $default,$name){
//为了真实非比填写字段随机50%几率为空
if (empty($required) && rand(1,1)){
return '';
}
//有默认值则直接返回默认值
if (!empty($default)){
return $default;
}
switch ($type){
case 'string' : return "Test ".$name;break;
case 'integer' : return rand(1,100);break;
}
}