CI 묻고 답하기

제목 ci4 unit test가 독립적으로 실행되지 않는것 같아요.
카테고리 CI4 관련
글쓴이 테드송 작성시각 2021/11/15 14:32:17
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 311   RSS

<?php

namespace App;

use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait;

class AAATest extends CIUnitTestCase
{
    use DatabaseTestTrait, FeatureTestTrait;

    protected $migrate = true;
    protected $refresh = true;
    protected $migrateOnce = true;
    protected $seed = 'Tests\Support\Database\Seeds\UserTestSeeder';
    protected $seedOnce = true;

    protected function setUp(): void
    {
        parent::setUp();
    }

    protected function tearDown(): void
    {
        parent::tearDown();
    }

    public function testChartSuc()
    {
        $headers = [
            'CONTENT_TYPE' => 'application/json',
        ];

        $body = [
            'params' => [
                [
                        data
                [
                        data
                ]
            ]
        ];

        $result = $this->withHeaders($headers)
                    ->withBodyFormat('json')
                    ->post('/endpoint', $body);

        $result->assertStatus(201);
        $result->assertJSONFragment(["success" => "success"]);
    }

    public function testChartFail()
    {
        $headers = [
            'CONTENT_TYPE' => 'application/json',
        ];

        $body = [
            'params' => [
                [
                   data
                ],
                [
                      data
                ]
            ]
        ];

        $result = $this->withHeaders($headers)
                    ->withBodyFormat('json')
                    ->post('/endpoint', $body);

        $result->assertStatus(400);
    }
}

 

위와같이 작성후 TC들을 개별 function 으로 만들어서 사용하고 있습니다.

이 경우 다른 test class에 정의된 다른 테스트와 관련있게 돌아가는(?) 느낌이 납니다.

 

실제로 위 테스트 함수의 순서를 바꾸면 실패하는 케이스도 생기구요.(전혀 순서에 문제 없어야 하는데...)

그리고 위 코드 테스트시 아예 다른 test.php 파일에 존재하는 테스트케이스가 실패했다고 뜨기도 합니다.

(전체 테스트중 다른 테스트 케이스 성공 실패 숫자에는 문제없음)

 

완벽히 독립적으로 테스트하려면 어떻게 해야 하나요?

 다음글 프로세스 증가시 연결이 비정상적으로 끊어집니다. (1)
 이전글 Call to undefined method 에러 (2)

댓글

테드송 / 2021/11/26 15:14:19 / 추천 1

위 문제의 원인은 validation 이었습니다.

선수행한 TC에서 error가 발생한 validate가 있었고

뒤에 수행된 TC에서 validation을 수행하는 순간 남아있던 에러로 인해

마치 A를 테스트 했는데 B의 테스트가 실행되는 것 처럼 보였습니다.

 

해결방법은

if (! $this->validate([]))
        {
            $this->validator->reset();
            return $this->responseFail($this->validator->getErrors());
        }

와 같이 validate에 실패할경우 외부에서 reset을 해줘야 하네요

 

**추가

버그인줄 알았는데 매뉴얼에도 나와있네요. 의도한 내용같습니다.

If you intend to run multiple validations, for instance on different data sets or with different rules after one another, you might need to call $validation->reset() before each run to get rid of errors from previous run. Be aware that reset() will invalidate any data, rule or custom error you previously set, so setRules()setRuleGroup() etc. need to be repeated:

테드송 / 2021/11/26 15:18:38 / 추천 1

또한 PHPUnit은 기본적으로 모든 GLOBAL 변수들을 가진채 TC들이 수행된다고 하네요.