PHPUnit单元测试的简单使用

何为单元测试:php

指对软件中的基本单元进行测试,如函数、方法等,以检查其返回值或行为是否符合预期;实际中软件是很复杂的,由许多组件构成,执行流程连贯在一块儿,要进行单元片断的测试,就须要为其提供执行上下文(或者说参数)和环境(好比打桩模拟一些对象)来运行,并监控其行为和返回值,为此咱们就须要写出作这件事情的程序代码,这样的代码叫作测试用例,许多测试用例有机结合在一块儿造成一个总体的测试,又叫作测试套件,被测试的程序代码叫作生产代码。phpunit这个软件就是用来帮助咱们写测试用例并进行测试的。html

 

php的单元测试:phpunitbootstrap

在其官网有详细教程,这里介绍一些补充内容。
首先要明白phpunit软件自己就是由php语言实现,其使用是经过命令行进行的,并非经过浏览器访问
明白这一点很重要,许多新人被卡在这里。很基础也很简单,但彷佛没怎么被说起数组

 

想试一下单元测试好久了,可是一直没有合适的项目,并且中文网络上的PHPUnit教程要么太旧,要么太乱,因此总也没学会。最近准备把手头的项目重构一下,决定开始使用PHPUnit作单元测试,先照着PHPUnit的官网作了一下Tutorial,虽然已经很简单了,仍然被卡住几回,因此写篇文章记录一下。由于对PHP的包管理系统不熟悉,这篇文章会从安装开始。浏览器


1.安装

PHPUnit若是使用PHAR安装的话很简单。Phar归档就像Java的Jar,能够直接被PHP解释器执行。在*nix系统下,能够执行下面三条命令:bash

➜ wget  
➜ chmod +x phpunit.phar
➜ sudo mv phpunit.phar /usr/local/bin/phpunit

考虑到此次的重构会引入比较多类库,我选择了Composer作依赖管理。我在Windows上试过PhpStorm里的Composer,老是失败,感受是网络很差的缘由。此次在Ubuntu下安装很顺利,全局安装Composer以后,在命令行执行网络

composer global require phpunit/phpunit

全局安装PHPUnit。而后在 ~/.bashrc 文件末尾加一行 PATH=$PATH:/home/feng/.composer/vendor/bin(注意替换用户名),来将Composer的global bin目录加入PATH。composer

安装事后运行 phpunit --version看到版本信息则说明安装成功。phpstorm

另外,装完之后我发现Ubuntu系统可使用 apt-get install phpunit来安装,但我没有试过。ide

在Windows下我用的是XAMPP环境,其中已经内置PHPUnit了。若是要在命令提示符下使用的话,能够修改环境变量中的PATH,在里面加上 C:\xampp\php(或者你修改后的路径)。再打开命令提示符,运行phpunit --version看一下。


2.第一个测试

第一个Tutorial我使用的是PHPUnit官网上的Getting Started,这里写的比它还要简单一点。

项目的目录结构以下:

 
├── phpunit.xml
├── src
│   ├── autoload.php
│   └── Money.php
└── tests
    └── MoneyTest.php
 

第一个文件是项目代码src/Money.php,内容以下:

amount = $amount;
    }

    public function getAmount()
    {
        return $this->amount;
    }

    public function negate()
    {
        return new Money(-1*$this->amount);
    }
}

 

与之对应的单元测试是tests目录下的MoneyTest.php,注意单元测试文件名最好是*Test.php,这样之后指定tests目录即可以执行目录下的全部测试。

negate();

        $this->assertEquals(-1, $b->getAmount());
    }
}

 

代码很简单,$this->assertEquals(-1, $b->getAmount());即断言后一个参数的执行结果与前一个参数相等,其余不解释了。

如今,若是在MoneyTest.php里加一行include_once('../src/Money.php');。而后在项目根目录下执行phpunit tests/MoneyTest,就能够看到执行结果了。


3.自动载入

可是,逐个添加include的方式太不方便,最好是能自动include所需的文件,PHPUnit提供了一个参数--bootstrap,可使用项目的autoload文件。这里我本身写了一个最简单的autoload.php,只要4行。这个文件并非PHPUnit专用的,应该放在src目录下。

<?php

function __autoload($class){
    include $class.'.php';
}

spl_autoload_register('__autoload');

 

当须要Money类时,就去include Money.php。写完__autoload()函数以后要用spl_autoload_register()注册上。

如今就能够去掉MoneyTest.php中的include语句,使用phpunit --bootstrap src/autoload.php tests/MoneyTest来执行测试了。

虽然能够自动载入,可是要执行的命令更长了。咱们还能够写一个配置文件来为项目指定bootstrap,这样就不用每次都写在命令里了。

配置文件phpunit.xml放在项目根目录下。

 

 

若是要执行MoneyTest,在项目根目录下执行:phpunit tests/MoneyTest
若是要执行tests目录下的全部测试,在项目根目录下执行:phpunit tests


Reference:

  1. Getting Started with PHPUnit – The PHP Testing Framework

  2. PHP: spl_autoload_register - Manual

  3. PHPUnit Bootstrap and Autoloading classes - Jess Telford

  4. Composer

标签: none

 

你可能会疑惑,上面的php代码是怎么回事呢?

那就是一个测试用例,简单的测试了一个数组操做,进行单元测试通常经过如下四步:

1. 针对生产代码类 Class 的测试写在类 ClassTest中。
2. ClassTest(一般)继承自 PHPUnit\Framework\TestCase。
3. 测试都是命名为 test* 的公用方法。也能够在方法的文档注释块(docblock)中使用 @test 标注将其标记为测试方法。
4. 在测试方法内,相似于 assertEquals()这样的断言方法用来对实际值与预期值的匹配作出断言判断。

这里你可能会有几个地方迷惑:

一、在注释块中使用的标注,php能够经过反射获得,程序能够利用获得的信息进行配置
二、上列中测试用例代码里面的TestCase类来自哪里?并无被加载啊?
上文提到phpunit自己是用php语言写成的,打包成了phar供使用,phar是可执行的,执行时首先执行包里面的存根文件stub
你能够按照上文云客的另一篇phar帖子介绍的方法提取还原phpunit.phar包,或者使用phpstorm这样的ide直接打开
在.phar/stub.php里你将看到存根代码,TestCase类就是在存根代码里面require的
“phpunit yunke”这条命令行代码将首先运行phpunit脚本,从存根文件开始执行,而后由phpunit加载测试用例代码
能够看出程序并非从测试用例脚本开始执行的,如今明白TestCase类哪里来的了吧

经过以上内容再配合官网文档,新手应该能够顺利入门了

相关文章
相关标签/搜索