phpunit에서 작성한 테스트 케이스를 기반으로 테스트 항목 테이블 작성

목적



제가 이전에 소속했던 팀에서는
1. 단위 시험표 작성(EXCEL 등의 문서)
2. 단위 테스트 작성
3. 구현
4. 테스트 실시

라고 하는 흐름으로 개발을 실시하고 있었습니다만, 단체 시험의 시험표를 작성과 보수해 가는 비용이 걸리게 되어
  • 유닛 코드 작성
  • 시험 항목표 자동 생성
  • 구현
  • 테스트 수행

  • 할 수 없는지 검토해 보았습니다.

    절차



    phpunit.xml에서 테스트 결과를 junit 형식으로 출력



    phpunit 매뉴얼 에 의하면 phpunit.xml에 type="junit"를 지정하면 테스트 실행시에 자동으로 로그를 출력해 주기 때문에 추기합니다.
    이번은 tests하에 log라는 폴더를 마련해 그쪽으로 출력합니다.

    phpunit.xml
        <logging>
            <log type="junit" target="./tests/log/logfile.xml"/>
        </logging>
    

    시도해보십시오.
    vendor/bin/phpunit
    PHPUnit 7.5.13 by Sebastian Bergmann and contributors.
    
    ...                                                                 3 / 3 (100%)
    
    Time: 1.33 seconds, Memory: 14.00 MB
    

    logfile.xml
    <testsuites>
    <testsuite name="" tests="3" assertions="3" errors="0" failures="0" skipped="0" time="1.102644">
    <testsuite name="Unit" tests="2" assertions="2" errors="0" failures="0" skipped="0" time="0.806409">
    <testsuite name="Tests\Unit\Auth\RegisterControllerTest" file="/var/www/html/tests/Unit/Auth/RegisterControllerTest.php" tests="1" assertions="1" errors="0" failures="0" skipped="0" time="0.768928">
    <testcase name="testExample" class="Tests\Unit\Auth\RegisterControllerTest" classname="Tests.Unit.Auth.RegisterControllerTest" file="/var/www/html/tests/Unit/Auth/RegisterControllerTest.php" line="16" assertions="1" time="0.768928"/>
    </testsuite>
    <testsuite name="Tests\Unit\ExampleTest" file="/var/www/html/tests/Unit/ExampleTest.php" tests="1" assertions="1" errors="0" failures="0" skipped="0" time="0.037481">
    <testcase name="testBasicTest" class="Tests\Unit\ExampleTest" classname="Tests.Unit.ExampleTest" file="/var/www/html/tests/Unit/ExampleTest.php" line="15" assertions="1" time="0.037481"/>
    </testsuite>
    </testsuite>
    <testsuite name="Feature" tests="1" assertions="1" errors="0" failures="0" skipped="0" time="0.296235">
    <testsuite name="Tests\Feature\ExampleTest" file="/var/www/html/tests/Feature/ExampleTest.php" tests="1" assertions="1" errors="0" failures="0" skipped="0" time="0.296235">
    <testcase name="testBasicTest" class="Tests\Feature\ExampleTest" classname="Tests.Feature.ExampleTest" file="/var/www/html/tests/Feature/ExampleTest.php" line="15" assertions="1" time="0.296235"/>
    </testsuite>
    </testsuite>
    </testsuite>
    </testsuites>
    

    ... 꽤 이해하기 어렵지만 일단 시험 내용을 출력할 수 있었습니다.

    보기 쉬운 형식으로 변환



    여기 의 XMLT 템플릿을 바탕으로 XML을 HTML로 변환하면 꽤 보기 쉬워지는 것 같기 때문에, 변환해 보겠습니다.

    ※xsltproc가 들어 있지 않은 경우는 다음의 커맨드로 인스톨 해 주세요.
    sudo apt-get install xsltproc
    

    여기가 HTML 변환용 명령입니다.
    xsltproc phpunit.xslt tests/log/logfile.xml > output.html
    

    여기가 출력된 HTML입니다, 꽤 보기 쉬워진 것이 아닐까요.


    다만, 그대로 사용하는 것만으로는 테스트 케이스가 출력되지 않기 때문에 시험의 내용을 알기 어렵게 느꼈으므로 템플릿의 내용을 조금 수정했습니다.


    수정 된 phpunit.xslt는 여기에도 배치되어 있으므로 좋아하게 사용하십시오.
    htps : // st. 기주 b. 코 m / 야마모토 타쿠 / 아 3cf2 6d498 a5 a855c0f948 a29scd

    실례



    샘플로 laravel 회원 등록 양식의 유효성 검증에 대한 단위 테스트를 작성하고 어떤 느낌이 드는지보십시오.

    먼저 다음 명령으로 laravel의 회원 기능 세트를 작성합니다.
    php artisan make:auth
    

    위의 명령으로 작성된 다음 함수를 테스트하는 테스트 코드를 작성하려고합니다.

    RegisterController.php
        /**
         * Get a validator for an incoming registration request.
         *
         * @param  array  $data
         * @return \Illuminate\Contracts\Validation\Validator
         */
        protected function validator(array $data)
        {
            return Validator::make($data, [
                //デフォルトのバリデーションだとひらがなでも登録できるので末尾の正規表現は追記しています。
                'name' => ['required', 'string', 'max:255', 'regex:/^[a-zA-Z0-9-_]+$/'],
                'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                'password' => ['required', 'string', 'min:8', 'confirmed'],
            ]);
        }
    

    RegisterControllerTest.php
    
    <?php
    
    namespace Tests\Unit\Auth;
    
    use App\Http\Controllers\Auth\RegisterController;
    use Tests\TestCase;
    
    class RegisterControllerTest extends TestCase
    {
        protected $target;
    
        /**
         * @return void
         */
        public function setUp(): void
        {
            parent::setUp();
            $this->target = new RegisterController();
        }
    
        /**
         * @test
         * @throws \ReflectionException
         */
        public function 正常系()
        {
            $method = $this->changeAccessible('validator');
    
            $input = [
                'name' => 'yamamoto-taku',
                'email' => '[email protected]',
                'password' => 'password',
                'password_confirmation' => 'password',
            ];
            $validator = $method->invoke($this->target, $input);
            $this->assertTrue($validator->passes());
        }
    
        /**
         * @param array $input
         * @dataProvider validatorProviderForFailure
         * @test
         * @throws \ReflectionException
         */
        public function 異常系(array $input)
        {
            $method = $this->changeAccessible('validator');
            $validator = $method->invoke($this->target, $input);
            $this->assertFalse($validator->passes());
        }
    
        /**
         * @return array
         */
        public function validatorProviderForFailure()
        {
            $input = [
                'name' => 'あいうえお',
                'email' => '[email protected]',
                'password' => 'password',
                'password_confirmation' => 'password',
            ];
            $null = [
                'name' => null,
                'email' => null,
                'password' => null,
                'password_confirmation' => null,
            ];
    
            return [
                '必須入力チェック' => [$null],
                '日本語入力ひらがな' => [$input],
            ];
        }
    
    
        /**
         * @param $object
         * @return mixed
         * @throws \ReflectionException
         */
        public function changeAccessible($methodName)
        {
            $reflection = new \ReflectionClass($this->target);
            $method = $reflection->getMethod($methodName);
            $method->setAccessible(true);
            return $method;
        }
    }
    
    

    phpunit을 실행하여 HTML로 변환을 처리합니다.
    vendor/bin/phpunit tests/Unit/Auth/RegisterControllerTest.php
    xsltproc phpunit.xslt tests/log/logfile.xml > output.html
    

    생성된 결과가 여기입니다.
    데이터 세트가 있는 시험 항목은 데이터 라벨로, 단일 시험 항목에 대해서는 함수명으로 검토자에게 어떤 시험을 실시할 것인지를 전할 수 있을 것 같습니다!


    끝에



    상기와 같은 자동 리포트의 기능을 사용해 단체 시험표를 별도로 쓰지 않아도 OK가 되면 좋다고 생각합니다. 그리고 변환의 처리도 맞추어 자동으로 할 수 있을 것 같은 생각도 하므로 그쪽도 별도 검토해 보려고 생각합니다.
    PHPUnit 테스트 러너를 확장하고 자동화 할 수 있었기 때문에 계속 작성했습니다.

    참고



    PHPUnit 테스트 결과를 인간 친화적 인 느낌으로 출력

    자동화 대상의 유닛 테스트(단체 테스트)의 사양서를 쓰는 것은 완전한 낭비이다

    좋은 웹페이지 즐겨찾기