跑通一个单元测试
by 夏泽民 Jun 23, 2020
单元测试testCase一般是放在项目根目录的tests目录下,可以建子目录对应一个模块,每一个test文件对应一个具体功能的单元测试点,然后在项目根目录建个phpunit.xml.dist来编排测试套件,测试时只用在phpunit.xml.dist所在目录运行phpunit命令即可。这里用composer主要用它的autoload。
安装相关环境支持
主要是安装Composer和Phpunit,具体查看相应官方文档即可,这里不细说。
生成项目对应vendor
根目录创建composer.json文件
{
“require”:{}
}
然后执行
composerupdate
根目录下会创建一个vendor目录,这里主要用到vendor/autoload.php
创建phpunit.xml.dist文件
在项目根目录创建phpunit.xml.dist
tests
创建一个简单测试用例
项目根目录创建tests目录,进入创建SampleTest.php文件,内容如下:
<?php
use PHPUnit\Framework\TestCase;
class SampleTest extends TestCase
{
public function testSomething()
{
// 可选:如果愿意,在这里随便测试点什么。
$this->assertTrue(true, ‘这应该已经是能正常工作的。’);
// 在这里停止,并将此测试标记为未完成。
$this->markTestIncomplete(
'此测试目前尚未实现。'
);
} }
进行单元测试
在根目录执行:
phpunit
就会看到测试情况:
phpunit
PHPUnit 3.7.10 by Sebastian Bergmann.
Configuration read from /Users/didi/PhpstormProjects/php/xiazemin/phpunit.xml.dist
Time: 50 ms, Memory: 4.00MB
No tests executed!
$phpunit tests/StatckTest.php
PHPUnit 3.7.10 by Sebastian Bergmann.
Class ‘tests/StatckTest’ could not be found in ‘/Users/didi/PhpstormProjects/php/xiazemin/tests/StatckTest.php’.
https://stackoverflow.com/questions/47946717/class-tests-dusktestcase-not-found-in-exampletest-php
估计是层级关系,重新安装依赖库
$composer require –dev phpunit/phpunit ^6.5
$ls
composer.json phpunit.xml.dist vendor
composer.lock tests
还是不可以
$./vendor/bin/phpunit
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.
I1......FE 9 / 9 (100%)
Time: 82 ms, Memory: 4.00MB
There was 1 error:
1) StackTest::testFailingInclude
ReflectionException: Class PHPUnit_Framework_Error does not exist
--
There was 1 failure:
1) StackTest::testAdd with data set #3 (1, 1, 3)
Failed asserting that 2 matches expected 3.
/Users/didi/PhpstormProjects/php/xiazemin/tests/StatckTest.php:47
ERRORS!
Tests: 9, Assertions: 10, Errors: 1, Failures: 1, Incomplete: 1.
https://phpunit.de/manual/6.5/zh_cn/phpunit-book.html#organizing-tests
测试单个文件
hahaTest.php 的基本内容可以这样写:
use PHPUnit\Framework\TestCase;
require("./src/index.php");
class hahaTest extends TestCase{
//必须是public且方法名是test开头的才会参与测试,protected和private的测试时会提示错误
public function test_index(){
$index=new index();//index.php中的类
$re=$index->haha();
$this->assertEquals(1,$re);//测试 ./src/index.php 中的index类的haha方法返回值是不是1
}
}
命令行运行:
phpunit hahaTest.php
测试整个文件夹的方法:
递归读取文件夹下所有的文件命名为 *Test.php,如果文件名不是Test.php结尾的,不会加载到测试
每个方法必须以test开关,否则会直接跳过
方法的权限必须是 public
运行 phpunit 目录名,即可
phpunit 中依赖 (@depends) 的使用:
depends 的使用:
/** //必须是文档注释,不能自动生成文档注释的要注意一下:第一行一定要两个*号
* @depends test_haha 提供数据的函数的返回值作为参数
*/
public function test_hehe($re){
//$re 是 test_haha 的返回值,可以在这个方法内使用
}
最好先创建一个基类:baseTest继承自 TestCase类,文件名为aaTest.php,写aa是保证让它最先被加载,加Test是因为不加的不会被加载运行。 aaTest.php 文件中可以写公共函数,需要公共引进的,一些前置的操作,然后其它测试类继承这个类就可以了
另一种解决方案: 使用 phpunit.xml 文件,把启动需要的内容写到 base.php 文件,然后在 phpunit 的 bootstrap 属于中引入该文件 执行 phpunit dir 时,如果没有添加 -c phpunit.xml 的话,它会自动在当前目录下查找phpunit.xml或phpunit.xml.dist文件,通过配制文件,可以指定加载顺序 在配置中引入了的文件会优先加载,然后会默认加载*Test.php文件
./Index/loginTest.php //写了的会优先加载
phpunit.xml 的配置:https://phpunit.readthedocs.io/zh_CN/latest/configuration.html#appendixes-configuration
问题
怎样指定测试文件的顺序?
跨文件/跨类 怎样使用@depends
怎样知道哪些测试方法被 phpunit 跳过了?
https://www.cnblogs.com/Jerry-blog/p/4988492.html
默认情况下,生产者所产生的返回值将“原样”传递给相应的消费者。这意味着,如果生产者返回的是一个对象,那么传递给消费者的将是一个指向此对象的引用。如果需要传递对象的副本而非引用,则应当用 @depends clone 替代 @depends。
PHPUnit命令行工具会输出一个字符来指示进展:
. 当测试陈宫时输出
F 当测试方法运行过程中一个断言失败时输出,例如一个失败的assertEquals()调用
E 当测试方法运行过程中产生一个错误时输出,错误是指意料之外的异常(exception)或者PHP错误
R 当测试被标记有风险时输出
S 当测试跳出时输出
I 当测试被标记不完整或为实现时输出
https://www.jianshu.com/p/c0396fbb0d6b
https://phpunit.de/manual/6.5/zh_cn/phpunit-book.html#organizing-tests
https://blog.csdn.net/fareast_mzh/article/details/82458491