codeception 接口级测试 (二)-编写测试代码

codeception 接口级测试 (二)-编写测试代码

api suit 配置

1
2
3
4
5
6
7
8
9
class_name: ApiTester
modules:
enabled:
- \tests\Helper\Api
- REST:
url: http://youurl.com/
depends: PhpBrowser
# 现在基本上 api 返回都是使用的 Json ,所以我们只讲 json 返回值的情况
part: Json

测试文件格式

codeception 有两种格式:

cest 是一系列测试的集合
cept 是一个单独的测试文件

后面我们都是用 cest 的格式

Cest 测试案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
namespace tests\rest;

use tests\ApiTester;

class AppControllerCest
{
private $token;
public function _before(RestApiTester $I)
{
$this->token = $I->amUserLogin($mobile);
}

public function getConfig(RestApiTester $I)
{
// sendGet 请求,会发送请求给需要测试的 api 路由,域名会直接使用在 yml 文件中设置的 url。
$I->sendGET('/user/app/config', [
'token' => $this->token,
'deviceId' => '6CB7B05E-DE62-415A-96CF-6D57B666F939',
]);
// 测试返回值是否存在,这个方法只能看返回值是一个固定值的情况
$I->canSeeResponseContainsJson(
[
'code' => 99999,
'data' => [
'ocrConfig' => [
'maxImg' => 30,
'overtime' => 60,
'width' => 750,
'height' => 1000,
'ocrCompressSize' => 300,
],
'iosScoreWindowText' => [
'title' => '好孩子是被夸出来的,拍作业也希望被鼓励呢~',
'suggestText' => '提提意见',
'scoreText' => '5星鼓励',
'ignoreText' => '下次再说',
],
],
'msg' => '成功',
]
);

// 测试返回值是一种类型,不一定需要确定具体的值
$I->canSeeResponseMatchesJsonType(
[
'data' => [
'shareConfig' => [
'h5Config' => [
'title' => 'string',
'subTitle' => 'string',
'thumbnail' => 'string',
'url' => 'string',
],
'certificateQRUrl' => 'string',
'resultPageQRUrl' => 'string',
'mainPageQRUrl' => 'string',
],
'coinSwitch' => 'integer',
'shareCoin' => [
'flag' => 'integer',
'count' => 'integer',
],
'recCoin' => [
'flag' => 'integer',
'count' => 'integer',
],
]
]
);
}
}

有些 api 不是幂等的,所以需要单独指定需要跑得测试:

1
codecept run api tests/AppControllerCest.php:getConfig

细心地读者看到这里就会发现 api test 的有点和缺点。
优点是写起来特别简单,并且可以帮助我们提升代码稳定性
但是另一方面的缺点也很明显,就是 api test 很难测试到细节的方面。