作为程序员一定要保持良好的睡眠,才能好编程

php单元测试PHPUnit入门及部署

发布时间:2020-03-13


提供一个PHPUnit 中文文档:



https://www.kancloud.cn/manual/phpunit-book/68609



何为单元测试:


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


phpunit官网地址:https://phpunit.de/


phpunit.png


那么我如何选择下载那个版本呢?


点击: currently supported versions  查看一下对应的版本


phpunit2.png



这里我们选择比较新的版本进行测试:


➜ wget -O phpunit https://phar.phpunit.de/phpunit-7.phar

➜ chmod +x phpunit

➜ ./phpunit --versionPHPUnit 7.0.0 by Sebastian Bergmann and contributors.


选择phpunit7 来使用。


phpunit_download.png


phpunit_down2.png


我们看到已经下载完成。




下面来看一个使用案例:


yunke.php

代码如下:

<?php
use PHPUnit\Framework\TestCase;

class yunkeTest extends TestCase
{
    public function testPushAndPop()
    {
        $stack = [];
        $this->assertEquals(0, count($stack));
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack) - 1]);
        $this->assertEquals(1, count($stack));
        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
}
?>


phpunitrun.png



使用命令去执行:


./phpunit yunke


或者 


./phpunit yunke.php



这样就可以了。


当看到这条命令的时候,说明您的第一个程序已经运行成功了。


[root@localhost phpunit]# ./phpunit yunke.php
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 84 ms, Memory: 8.00MB

OK (1 test, 5 assertions)


那就是一个测试用例,简单的测试了一个数组操作,进行单元测试一般通过以下四步:


1. 针对生产代码类 Class 的测试写在类 ClassTest中。

2. ClassTest(通常)继承自 PHPUnit\Framework\TestCase。

3. 测试都是命名为 test* 的公用方法。也可以在方法的文档注释块(docblock)中使用 @test 标注将其标记为测试方法。

4. 在测试方法内,类似于 assertEquals()这样的断言方法用来对实际值与预期值的匹配做出断言判断。




其他测试:




PHPUnit从零开始(2):编写 PHPUnit 测试

https://blog.csdn.net/hel12he/article/details/50716771




凡是写在控制器类中 所有的test 方法 都会依次执行

public function testIncrementsDate()
{
    $d = new DateTime('2011-03-15 11:15:00');
    $f = new DayOfWeekField();
    $f->increment($d);
    $this->assertEquals('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s'));

    $d = new DateTime('2011-03-15 11:15:00');
    $f->increment($d, true);
    $this->assertEquals('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s'));
}

//判断是不是boolean 真
public function testValidatesHashValueNth()
{
    $f = new DayOfWeekField();
    $this->assertTrue($f->isSatisfiedBy(new DateTime(), '3#6'));
}

//判断假
$this->assertFalse($f->validate('-mon'));



$this->assertInstanceOf('Symfony\Component\Debug\ErrorHandler', $handler);
$this->assertSame($handler, ErrorHandler::register());

 $this->assertEquals(__FILE__, $exception->getFile());
 $this->assertRegExp('/^Notice: Undefined variable: (foo|bar)/', $exception->getMessage());
 $this->assertArrayHasKey('foobar', $exception->getContext());



举例说明

class MinutesFieldTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Cron\MinutesField::validate
     */
    public function testValdatesField()
    {
        $f = new MinutesField();
        $this->assertTrue($f->validate('1'));
        $this->assertTrue($f->validate('*'));
        $this->assertTrue($f->validate('*/3,1,1-12'));
    }

    /**
     * @covers Cron\MinutesField::increment
     */
    public function testIncrementsDate()
    {
        $d = new DateTime('2011-03-15 11:15:00');
        $f = new MinutesField();
        $f->increment($d);
        $this->assertEquals('2011-03-15 11:16:00', $d->format('Y-m-d H:i:s'));
        $f->increment($d, true);
        $this->assertEquals('2011-03-15 11:15:00', $d->format('Y-m-d H:i:s'));
    }
}




phpunit 执行单元测试文件中的一个方法


./vendor/bin/phpunit tests/Feature/PrescriptionTest.php --filter testCreatePrescriptionNotes


黑色加粗字体是 单元测试文件

蓝色字体 关键字

红色字体 要执行的方法