先了解一下大概情况吧

这里利用的thinkphp 内置的test的扩展,对应的phpunit的版本为phpunit6版本。尽管是旧版本,做一些简单的测试还是可以的

安装phpunit

➜ wget http://phar.phpunit.cn/phpunit.phar

➜ chmod +x phpunit.phar

➜ sudo mv phpunit.phar /usr/local/bin/phpunit

➜ phpunit --version

安装thinkphp的test扩展

composer require topthink/think-testing=2.0.*

 安装完成之后,thinkphp目录下会多一个test目录

ThinkPHP 利用PHPUnit 进行简单的测试-LMLPHP

安装完成之后,thinkphp目录下会多一个test目录

如何进行测试

下面举一个例子ThinkPHP 利用PHPUnit 进行简单的测试-LMLPHP

我们先写一个简单的service,然后在test 目录里面 写入

ThinkPHP 利用PHPUnit 进行简单的测试-LMLPHP

现在就完成了一个简单地测试。测试这个service是否按照我们的想法进行运算。

我们使用命令行在根目录下 输入 php think unit

ThinkPHP 利用PHPUnit 进行简单的测试-LMLPHP

显示测试完毕,正常显示。

断言函数

以上内容的assertEquals是所有断言函数的一种,具体用法可以自行百度,本文章日后会慢慢补充完毕。

基镜

目前以上内容已经可以测试每一个service的运行状况。但是有一部分service 需要有运行的前提条件,我们把创建基础环境或者依赖制作成可测试的状态成为基镜的搭建。

举个栗子,比如我们在测试新增管理员的时候需要依赖某个数据库的某个值。那么我们可以试试以下方法

<?php

namespace tests;

class ExampleTest extends TestCase
{
    protected $a;

    protected function setUp(): void
    {
        parent::setUp();
        //假设这里我们从数据库中查询出来的a的值为1
        $this->a=1;
    }


    public function testplanService():void
    {
        $test=new \app\index\service\Test;
        //这里我们可以灵活的使用这个a的值。不需要手动输入固定的值
        $this->assertEquals(2,$test->planService($this->a,1));
    }
}

测试数据的移除

我们在测试的时候难免会产生一系列测试数据,我们如何在测试完毕之后删除这些数据呢,看看以下的例子

<?php

namespace tests;

class ExampleTest extends TestCase
{
    protected $a;

    protected function setUp(): void
    {
        parent::setUp();
        $this->a=1;
    }


    public function testplanService():void
    {
        $test=new \app\index\service\Test;
        $this->assertEquals(2,$test->planService($this->a,1));
    }


    //运行测试完毕之后,测试框架会自动调用该类销毁数据库的插入数据等等
    protected function tearDown(): void
    {
        $this->assertEquals(1,1);
        //销毁数据操作
    }
}

数据供给器

现在假设有如下情况。

插入一个管理员记录,要求管理员的账号长度大于6位,小于9位。首字母大写等等。我们不可能一种情况一个个去测试,对于这种情况,我们可以利用数据供给器来提供批量的数据。

我们新建一个service类

<?php

namespace app\index\service;

class Admin
{
    public function add(string $username,string $password):bool
    {
        if(!preg_match('/^[A_Z]\S{6,8}$/',$username))
        {
            return false;
        }
        return true;
    }
}

下面我们补上测试代码

<?php
namespace tests;

use think\testing\TestCase;

class AddTest extends TestCase
{
    protected $add;

    protected function setUp(): void
    {
        $this->add=new \app\index\service\Admin;
    }

    /**
     * @dataProvider addData
     * @param string $usernmae
     * @param string $password
     */
    public function testAdd(string $username,string $password):void
    {
        $this->assertFalse($this->add->add($username,$password));
    }

    /**
     * 测试情况为true
     *
     * @return void
     */
    public function testAdd_true():void
    {
        //断言为true
        $this->assertTrue($this->add->add('A123456','1111'));
    }

    //add 方法数据供给器
    public function addData()
    {
        return [
            //数据小于6位
            ['s123','1111'],
            //数据大于9位
            ['A123456789','1111'],
            //首字符小写
            ['s1234567','1111']
        ];
    }
}

补上结果

localhost:think yehua$ php think unit
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

....                                                                4 / 4 (100%)

Time: 92 ms, Memory: 6.00MB

OK (4 tests, 4 assertions)

以上内容就是最简单的测试方法。合理利用这些方法。可以让你的程序更加健壮。

08-05 18:29