PHPunit安装及配置
项目中引入PHPunit
composer require phpunit/phpunit
安装PHPunit脚本
下载跟当前PHP版本兼容的phpunit.phar
phpstorm里配置好脚本路径
phpstorm中Languages & Frameworks > PHP > Test Frameworks
配置phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--bootstrap指定启动测试时, 先加载vendor/autoload.php-->
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
<!--testsuite指定测试文件的目录-->
<testsuite name = "aaa">
<directory suffix="Test.php">tests</directory>
</testsuite>
</phpunit>执行单元测试
xml 解释
bootstrap="./vendor/autoload.php"
在测试之前加载的的PHP 文件,一般可以做一个初始化工作
<testsuite name="actionsuitetest">
<directory suffix=".php">action</directory>
<file>Order.php</file>
</testsuite>
测试套件,如果想测试页面,action,model 可以多加几个测试套件
name: 套件名称
directory :套件测试的目录,目录下一般放测试文件的用例
suffix :测试文件后缀,如果不填写,则默认后缀为*Test.php,即phpunit 默认会执行*Test.php 的文件
action:测试目录名
file:可以单独设置测试文件
exclude:排除不需要测试的文件
<filter> 元素及其子元素用于配置代码覆盖率报告所使用的白名单。
blacklist 黑名单(不需要统计覆盖率的文件),whitelist 白名单(统计覆盖率的测试文件) 当黑名单与白名单文件重复时,白名单起作用
<logging> 元素及其 <log> 子元素用于配置测试执行期间的日志记录。
单元测试编写
测试类继承PHPUnit\Framework\TestCase
类名以Test为后缀,可以在phpunit.xml中设置
测试方法必须为public,以test为前缀
tests目录下新建一个类BaseTest.php
如下示例,断言1+1 和2是否想等
<?php
namespace tests;
class BaseTest extends \PHPUnit\Framework\TestCase
{
public function testA()
{
$this->assertEquals(1+1, 2);// assertEquals()用来对实际值与预期值的匹配做出断言
}
}
执行单元测试
单个方法执行
方法名上右键 run testAAA即可,执行结果显示在最底部
单个文件或类执行
类名上右键执行
全部执行
phpunit.xml 上右键
接口单元测试方法
socket接口
以websocket为列,介绍下编写测试方法来测试接口是否符合预期
BaseTest作为基类,里面提供网络请求方法request连接websocket接口
<?php
namespace tests;
class BaseTest extends \PHPUnit\Framework\TestCase
{
private $host = 'tcp://172.17.0.3:7273';
public function request($param)
{
$client = stream_socket_client($this->host);
if(!$client)exit("can not connect");
fwrite($client, json_encode($param,JSON_UNESCAPED_SLASHES)."\n");
// 读取推送结果
$msg = fread($client, 8192);
// $msg = '';
// while (!feof($client)) {
// $msg .= fread($client, 8192);
// }
$response = json_decode($msg,true);
return $response;
}
testGood.php 用于商品类的测试,该类继承BaseTest类,用来测试商品添加等操作的正确用例能否通过
t h i s − > a s s e r t E q u a l s ( this->assertEquals( this−>assertEquals(res[‘code’], 0);意思是接口返回的code为0,则断言通过
<?php
namespace tests;
require_once __DIR__ . '/BaseTest.php';
class GoodTest extends BaseTest
{
public function testList()
{
$param = [
'api'=> 'm-good-list',
'app'=> 'iphone',
'ver'=> '1.0',
'data'=> [
],
];
$res = $this->request($param);
var_dump(json_encode($res));
$this->assertEquals($res['code'], 0);
}
public function testAdd()
{
$param = [
'api'=> 'm-good-add',
'app'=> 'iphone',
'ver'=> '1.0',
'data'=> [
'image' => [
'aa.com',
'bb.com',
],
'title' => 'xxxx',
'brief' => 'xxxx',
'market_price' => 100,
'price' => 100,
'score' => 22,
'stock' => 22,
'content' => 'vdfgbdfhb',
],
];
$res = $this->request($param);
var_dump(json_encode($res));
$this->assertEquals($res['code'], 0);
}
http接口
http接口可以使用curl进行网络请求来测试
数据有多组时可以用注解@dataProvider指定数据源
比如
/**
* @dataProvider addProvider
*/
public function testAppAdd($data)
{
$param = [
'api'=> 'index/Comment/add',
'app'=> 'iphone',
'ver'=> '1.0',
'data'=> $data,
];
$res = $this->request($param);
var_dump(json_encode($res));
$this->assertEquals($res['code'], 0);
}
public function addProvider()
{
return array(
[['lecture_id' => 1,
'to_comment_id' => 0,
'content' => 'hufleiwaufyhlieurhuihuifweahuifihuehuifehui',
]],
[[
'lecture_id' => 1,
'to_comment_id' => 1,
'content' => 'hahah2',
]],
[[
'lecture_id' => 1,
'to_comment_id' => 2,
'content' => 'hahah3',
]],
);
}
phpunit常用断言函数
布尔类型 | |||
---|---|---|---|
方法名 | 含义 | 参数 | 返回值 |
assertTrue | 断言为真 | ||
assertFalse | 断言为假 | ||
NULL类型 | |||
方法名 | 含义 | 参数 | 返回值 |
assertNull | 断言为NULL | ||
assertNotNull | 断言非NULL | ||
数字类型 | |||
方法名 | 含义 | 参数 | 返回值 |
assertEquals | 断言等于 | ||
assertNotEquals | 断言大于 | ||
assertGreaterThan | 断言不等于 | ||
assertGreaterThanOrEqual | 断言大于等于 | ||
assertLessThan | 断言小于 | ||
assertLessThanOrEqual | 断言小于等于 | ||
字符类型 | |||
方法名 | 含义 | 参数 | 返回值 |
assertEquals | 断言等于 | ||
assertNotEquals | 断言不等于 | ||
assertContains | 断言包含 | ||
assertNotContains | 断言不包含 | ||
assertContainsOnly | 断言小于 | ||
assertLessThanOrEqual | 断言只包含 | ||
assertNotContainsOnly | 断言不只包含 | ||
数组类型 | |||
方法名 | 含义 | 参数 | 返回值 |
assertEquals | 断言等于 | ||
assertNotEquals | 断言不等于 | ||
assertArrayHasKey | 断言有键 | ||
assertArrayNotHasKey | 断言没有键 | ||
assertContains | 断言包含 | ||
assertNotContains | 断言不包含 | ||
assertContainsOnly | 断言只包含 | ||
assertNotContainsOnly | 断言不只包含 | ||
对象类型 | |||
方法名 | 含义 | 参数 | 返回值 |
assertAttributeContains | 断言属性包含 | ||
assertAttributeContainsOnly | 断言属性只包含 | ||
assertAttributeEquals | 断言属性等于 | ||
assertAttributeGreaterThan | 断言属性大于 | ||
assertAttributeGreaterThanOrEqual | 断言属性大于等于 | ||
assertAttributeLessThan | 断言属性小于 | ||
assertAttributeLessThanOrEqual | 断言属性小于等于 | ||
assertAttributeNotContains | 断言不包含 | ||
assertAttributeNotContainsOnly | 断言属性不只包含 | ||
assertAttributeNotEquals | 断言属性不等于 | ||
assertAttributeNotSame | 断言属性不相同 | ||
assertAttributeSame | 断言属性相同 | ||
assertSame | 断言类型和值都相同 | ||
assertNotSame | 断言类型或值不相同 | ||
assertObjectHasAttribute | 断言对象有某属性 | ||
assertObjectNotHasAttribute | 断言对象没有某属性 | ||
class类型 | |||
方法名 | 含义 | 参数 | 返回值 |
assertClassHasAttribute | 断言类有某属性 | ||
assertClassHasStaticAttribute | 断言类有某静态属性 | ||
assertClassNotHasAttribute | 断言类没有某属性 | ||
assertClassNotHasStaticAttribute | 断言类没有某静态属性 | ||
文件相关 | |||
方法名 | 含义 | 参数 | 返回值 |
assertFileEquals | 断言文件内容等于 | ||
assertFileExists | 断言文件存在 | ||
assertFileNotEquals | 断言文件内容不等于 | ||
assertFileNotExists | 断言文件不存在 | ||
XML相关 | |||
方法名 | 含义 | 参数 | 返回值 |
assertXmlFileEqualsXmlFile | 断言XML文件内容相等 | ||
assertXmlFileNotEqualsXmlFile | 断言XML文件内容不相等 | ||
assertXmlStringEqualsXmlFile | 断言XML字符串等于XML文件内容 | ||
assertXmlStringEqualsXmlString | 断言XML字符串相等 | ||
assertXmlStringNotEqualsXmlFile | 断言XML字符串不等于XML文件内容 | ||
assertXmlStringNotEqualsXmlString | 断言XML字符串不相等 |