跑通一个单元测试

单元测试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


Category php