programing

Laravel 테스트는 각 테스트 후에 트랜잭션을 롤백하지 않습니다.

goodcopy 2023. 1. 20. 17:35
반응형

Laravel 테스트는 각 테스트 후에 트랜잭션을 롤백하지 않습니다.

내 테스트에서 특성을 사용하고 있습니다.RefreshDatabase테스트를 시작하기 전에 "새로 고침"하고 각 테스트 방법에 대해 트랜잭션을 사용합니다.

이행은 정상적으로 동작하지만 트랜잭션은 전혀 동작하지 않습니다.

설정을 공개하려고 합니다.

  • 도커 컨테이너에서 실행되는 MariaDB 10.1(테스트에서 사용되는 모든 테이블이 InnoDB에 있으므로 트랜잭션이 지원됨)
  • 기본 테스트 클래스는RefreshDatabase
  • 테스트를 위해 다른 연결을 시도했습니다.$connectionsToTransact또한 테스트에 기본 연결을 사용합니다.트랜잭션도 작동하지 않습니다.

마이 셋업 방법:

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

    Queue::fake();
}

테스트 클래스 및 테스트 베이스 클래스의 자세한 내용은 다음 Gist를 참조하십시오.https://gist.github.com/patriziotomato/e25de1e160dace08edefa682b64bd150

이미 디버깅을 시도하고 PDO로 내려와서 트랜잭션을 시작하고 롤백하기 때문에 라벨 코드가 트랜잭션과 롤백을 시도하지만 테스트에는 영향을 주지 않습니다.

또 뭐가 잘못될지 아이디어가 필요해

사용하고 있을 가능성이 있습니다.Model::truncate().

불행하게도truncate()는 MySQL 5.1.32 이후의 트랜잭션과 "호환성"이 없습니다.테이블은 드롭할 수 있지만 드롭할 수 없습니다.truncate()거래 내부를 확인합니다.

http://dev.mysql.com/doc/refman/5.1/en/truncate-table.html

이 URL에 따르면 MySQL 5.1.32 현재 TRUNCATE TABLE은 DELETE와 같은 DML이 아닌 DDL입니다.즉, TRUNCATE TABLE은 트랜잭션블록 중간에 암묵적인 COMMIT를 발생시킵니다.따라서 비워둘 필요가 있는 테이블에서는 TRUNCATE TABLE 대신 DELETE FROM을 사용합니다.

StackOverflow 및 Laracasts 관련 답변:

비슷한 MySQL 셋업에서도 같은 문제가 있었습니다.또한 위에서 Anthony의 솔루션을 사용해 봤는데, 같은 것을 보았습니다....1305 SAVEPOINT trans2 does not exist...에러도 마찬가지입니다.

제 경우 범인은 범인이고Model::truncate()(reimport 명령어)의 경우).Larabel의 트랜잭션/롤백 처리(혹은 MySQL?)가 혼란스러워서 위와 같은 오류가 발생한 것 같습니다.사용.Model::all()->each->delete()대신 내 문제를 해결했다.(좀 더 테스트한 결과 auto_increment 값도 리셋할 수 없는 것 같기 때문에 문제가 있을 수 밖에 없습니다.)

메모리 내 데이터베이스에서는 발생하지 않았지만 MySQL 셋업에서는 발생할 수 있습니다.예를 들어 악성 엔트리가 그대로 남아 있는 경우 디버깅이 어려운 오류가 발생하기 쉬우므로 주의하시기 바랍니다.:)

UPDATELaracast 스레드에 대한 최선의 답변은 실제로 트랜잭션 조작이 동작 중에 암묵적인 커밋을 가지며 테스트 중에 트랜잭션스택이 느려지는 것을 설명하고 있습니다.

저도 같은 문제가 있어요.정확한 원인을 찾지 못했지만 수동으로 트랜잭션을 시작하고 롤백하는 해결 방법이 있습니다.

public function setUp()
{
    parent::setUp();
    DB::beginTransaction();
}

public function tearDown()
{
    DB::rollback();
    parent::tearDown();
}

, 「 」를 합니다.DatabaseTransactions:

...
use Illuminate\Foundation\Testing\DatabaseTransactions;
...

class SomeTest extends TestCase {

    use DatabaseTransactions;

public some_assertion_method()
{
    ...
}

파일 phpunit을 변경합니다.xml

<php>
        <env name="DB_CONNECTION" value="mysq"/>
        <env name="APP_ENV" value="local"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="MAIL_DRIVER" value="array"/>
        <env name="SMS_DRIVER" value="array"/>
</php>

테스트 파일에 다음 특성 추가:

use DatabaseTransactions;

언급URL : https://stackoverflow.com/questions/48725056/laravel-tests-dont-rollback-transaction-after-each-test

반응형