PHPUnit 测试用例

  1. 单元测试 & 功能测试 两个概念
    • 单元测试是一种通过编写测试代码来确认函数、类和方法是否以我们预期的方式来工作,单元测试会贯穿整个项目的开发周期。通过检查各个函数和方法的输入输出,就可以保证代码内部的逻辑已经正确执行,PHPUnit 就是最著名的单元测试框架。
    • 功能测试是通过使用工具来生成自动化的测试用例,然后在真实的系统上运行,而不是单元测试中简单的验证单个模块的正确性。这些工具会使用有代表性的真实数据来模拟真实用户的行为从而验证系统的正确性,常见的测试工具有 Selenium,用于浏览器功能测试的 Laravel Dusk 就是基于 Selenium 实现的。
  2. 安装(注意版本)
    composer require --dev phpunit/phpunit ^7
  3. 根目录下 test 目录用于存放测试代码,根目录下 phpunit.xml文件用于编排PHPUnit测试。
    初始化文件内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <phpunit bootstrap="vendor/autoload.php" colors = "true" verbase="true" stopOnFailute="false">
    
    <testsuites>
    <testsuite name="Unit">
        <directory>./tests/Unit</directory>
    </testsuite>
    </testsuites>
    </phpunit>

    参照文档:https://phpunit.readthedocs.io/zh_CN/latest/organizing-tests.html#xml

  4. 单元测试基本约定
    1. 测试文件名需要以 Test 作为后缀,比如如果要测试 First.php,则对应的测试文件名为 FirstTest.php
    2. 测试方法名需要以 test 作为前缀,比如如果要测试的方法名为getuser,则对应的测试方法名为testGetuser,此外,你还可以通过 @test 注解来声明一个测试方法;所有的测试方法可见性必须是 public;
    3. 所有的测试类都继承自 PHPUnit\Framework\TestCase。
  5. 创建命令
    php artisan make:test UserTest --unit
  6. 测试
    1. 断言JSON数据是否存在
      function test_json_response()
      {
          $response = $this->json('GET', '/api/user/1');
          $response
          ->assertStatus(200)
          ->assertJsonFragment([
              'name' => 'Temer',
          ]);
      }
    2. 技巧
      https://learnku.com/articles/17529#692bf1

ExampleTest

    <?php

    namespace Tests\Unit;

    use Tests\TestCase;
    use Illuminate\Foundation\Testing\WithFaker;
    use Illuminate\Foundation\Testing\RefreshDatabase;
    use GuzzleHttp\Client;

    class ExampleTest extends TestCase
    {
        /**
         * A basic test example.
         *
         * @return void
         */
        public function testApi()
        {
            //$this->assertTrue(true);
            $header = [
                'Accept'=>'application/json',
                'Authorization'=>'Bearer rWDi47JAROcQhTkes1oN8hTsN0wYUvvG3z9arabcde'
            ];
            $response = $this->get('/api/test-api',$header);
            $response
            ->assertStatus(200);
            //->assertJsonFragment(['msg' => 'ok',]);
        }

        public function testTestGet()
        {
            $http = new Client();
            $uri = env('LOCAL_API_URL');
            $getUrl = $uri.'test-api-get';
            $getOptions = [
                'json'=>[
                'get'=>'get',
                'test'=>'test'
                ]
            ];
            if(!isset($getOptions['connect_timeout']))
                {
                    $getOptions['connect_timeout'] = 100;
                }
                $getRes = $http->request('get', $getUrl, $getOptions)->getBody()->getContents();
            $res = json_decode($getRes,true);
            //\Log::debug($res);
            //$this->assertJsonFragment($getRes,['msg'=>'test-api-get-ok']);
            $this->assertArraySubset($res,['msg'=>'test-api-get-ok']);
            //$this->assertArrayHasKey('bar',['bar'=>'baz']);

        }
        public function testTestPost()
        {   
            /*
            $header = [ 
                'Accept'=>'application/json',
                'Authorization'=>'Bearer rWDi4I0wYUvvG3z9arVDj2a'
            ];
            $postArr = [
            'post'=>'post',
            'test'=>'test'
            ];
            $response = $this->post(env('LOCAL_API_URL').'test-api-post',$postArr,$header);
            $response
            //->seeJson(['msg'=>true]);
            ->assertStatus(200)
            ->assertJsonFragment(['msg' => 'test-api-post-ok',]);
            */
            $http = new Client();
            $uri = env('LOCAL_API_URL');
            $getUrl = $uri.'test-api-post';
            $getOptions = [ 
                'json'=>[
                    'post'=>'post',
                    'test'=>'test'
                ]   
            ];  
            if(!isset($getOptions['connect_timeout']))
            {   
                $getOptions['connect_timeout'] = 100;
            }   
            $getRes = $http->request('post', $getUrl, $getOptions)->getBody()->getContents();
            $res = json_decode($getRes,true);
            $this->assertArraySubset($res,['msg'=>'test-api-post-ok']);

        }
    }

参考文档:
https://laravelacademy.org/post/19576.html
https://learnku.com/laravel/t/26684
http://www.phpunit.cn/
http://www.phpunit.cn/manual/7.0/zh_cn/index.html
https://learnku.com/articles/17529