MySQL 트랜젝션은 auto_increment 값을 되돌리지 않음

라라벨 애플리케이션에서 아래와 같은 테스트를 작성했습니다. 이해를 돕기 위해 구체적인 내용은 생략했습니다.

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class SampleTest extends TestCase
{
    use RefreshDatabase;

    testFirst()
    {
        //테이블 A에 데이터 10개 추가
        //테스트 수행
    }

    testSecond()
    {
        //테이블 A에 데이터 11개 추가
        //테이블 A에서 데이터 10개를 ID 역순으로 조회 후, 10번째의 데이터의 ID가 값을 확인하는 테스트
    }
}

RefreshDatabase 트레이트를 사용했기 때문에 testSecond 테스트에서 ID는 2가 될 것으로 예상했습니다. 하지만 12가 나와서 테스트를 통과하지 못하더군요.

처음에는 RefreshDatabase의 트랜젝션이 동작하지 않는다고 의심했는데, 알고보니 트랜젝션이 auto_increment 값은 되돌리지 않았기 때문이었습니다.

이전 테스트가 다음 테스트에 영향을 미치지 않아야하지 않나 생각하는데, RefreshDatabase를 쓸 때는 auto_increment 값은 롤백되지 않는다는 점에 주의해서 테스트 코드를 작성해야겠습니다.

Mockery::close() 가 예외를 발생시키면 DatabaseTransactions 트레이트가 동작하지 않음

메소드 하나만 테스트 돌렸을 땐 통과되던게, 파일을 통으로 돌리니까 에러가 나더군요.

에러가 나는 원인을 보니, 데이터베이스에서 락이 걸렸기 때문이었습니다.

DatabaseTransactions 트레이트를 쓰고 있어서, 이전 테스트가 다음 테스트에 영향을 줄 이유가 전혀 없어보이는데, 대체 락이 왜 걸릴까? 찾다보니 원인은 Mockery 때문이었습니다. 이 링크 덕분에 알게 됐어요.  이 글 없었으면 며칠 날릴뻔 했네요. 소중한 정보 공유해준 얼굴 모를 개발자에게 오늘도 감사를!

Mockery를 쓰려고 했다가 필요 없어져서 테스트 코드에서는 Mockery 쓰는 부분을 다 제거했는데, 종료하는 코드를 남겨뒀더라구요.

public function tearDown() {
    Mockery::close();
}

종료할 Mockery가 없는데 종료를 해서 예외가 발생했었나봅니다. Mockery가 예외를 발생시키면, 트랜젝션이 롤백되지 않은채로 테스트가 멈추기 때문에 락이 걸린 채로 다음 테스트가 실행되나 봅니다.

위 코드를 제거하고 돌리니 잘 되네요.

오늘의 삽질 로그 끝

익혀야할 것

오늘 업무를 종료하며 내일은 아래 두 가지를 익혀야겠다고 생각했습니다.

  1. Laravel HTTP 테스트에서 Mockery를 사용하는 방법
  2. Laravel HTTP 테스트 실행시 xdebug 로 디버깅하는 방법

오늘은 테스트를 작성하면서 삽질을 많이했는데, 첫번째 것은 오늘 삽질 결과 알아낸 해결책이고, 두번째 것은 오늘과 같은 삽질을 덜 고통스럽게 하는 해결책입니다.

Docker-sync 발견

맥용 도커는 매우 느립니다. 좀 더 빠르게 할 수 있는 방법이 없나 조금 찾아보니 누군가 docker-sync 라는 프로그램으로 해결했다는 댓글이 있더군요. [관련글]

일단 낮에 한 번 시도했었는데, 도커를 잘 몰라서 그런가 잘 안되더군요. ㅠ 삽질을 좀 해야할 것 같아요. 과연 사용하는데 성공할 수 있을것인지!

YES24의 선택!

오늘 YES24에 가보니 YES24의 선택에 제 책이 두둥~

앱스토어에서는 피쳐드되면 다운로드 폭발하고 그러던데, 이 동네에선 아마 그렇지 않겠지? ㅠ

여튼 표지도 커다랗게 나오고 기분은 좋구만 히힛

없어지기 전에 박제!

PSR-2 강제하기

오랜만에 모던 PHP 유저 그룹에서 발표를 했습니다.

희대의 폭망 발표가 됐지만, 그래도 준비한 게 있으니 정리해서 정기모임 발표 자료 저장소에 올려두었습니다.

제목은 PSR-2 강제하기입니다. 표준 스타일을 지키자고 합의를 했다고 해도, 매번 상대방이 코딩 표준을 지켰는지 확인하는 건 번거로운 일이죠. 책을 쓰면서 조사하다보니 코딩 표준을 지키지 않으면 커밋을 못하도록 하는 아주 간단한 방법이 있어서 소개해봤습니다.

PSR-2 강제하기

 

[참고자료]

Enforce code standards with composer, git hooks, and phpcs

프랑스 대통령 마크롱의 En Marche ! 웹사이트 소스코드가 github 에서 화제

이번주에 PHP와 관련된 가장 인기있는 github 저장소에 불어로 소개된 저장소가 올라왔네요. 프랑스에 PHP 고수들이 많으니 뭔가 새로운게 나왔나 싶어서 봤습니다.

프랑스 대통령 마크롱이 2016년에 만든 En Marche ! 라는 정치 운동의 웹사이트의 소스코드네요. 프랑스라 그런지 프랑스 개발자들이 주도해서 만든 심포니라는 프레임워크로 만들었습니다.

En Marche ! 는 집집마다 다니면서 프랑스에 어떤 문제가 있는지 묻는 정치 캠페인이고, 마크롱이 만든 정당명이기도 한가보네요. 여튼 En Marche ! 는 다른 정당들과 달리 아무런 인프라가 없었기 때문에 시작부터 인터넷에 의존할 수 밖에 없었다고 합니다.

오픈 소스 웹 사이트를 적극 활용한 정치 캠페인, 의원 한 명 없는 신생 정당에서 탄생한 대통령. 그리고 웹 사이트 저장소의 인기. 뭔가 재밋네요 ㅎ 마크롱에 대해 아는게 거의 없었는데 좀 찾아서 읽어봐야겠어요.

Laravel elixir version 기능이 제대로 작동하지 않는 경우

몇 주만에 라라벨로 만든 애플리케이션을 수정하려고 했는데, gulp 명령어를 실행하니 에러가 났습니다.

SyntaxError in plugin 'run-sequence(version)'
Message:
Unexpected token s in JSON at position 41
Stack:
SyntaxError: Unexpected token s in JSON at position 41
at Object.parse (native)
at VersionTask.deleteManifestFiles (/home/vagrant/Code/bookcafe100.com/node_modules/laravel-elixir/dist/tasks/VersionTask.js:113:29)
at VersionTask.gulpTask (/home/vagrant/Code/bookcafe100.com/node_modules/laravel-elixir/dist/tasks/VersionTask.js:71:18)
at VersionTask.run (/home/vagrant/Code/bookcafe100.com/node_modules/laravel-elixir/dist/tasks/Task.js:138:31)
at Gulp.<anonymous> (/home/vagrant/Code/bookcafe100.com/node_modules/laravel-elixir/dist/tasks/GulpBuilder.js:65:67)
at module.exports (/home/vagrant/Code/bookcafe100.com/node_modules/orchestrator/lib/runTask.js:34:7)
at Gulp.Orchestrator._runTask (/home/vagrant/Code/bookcafe100.com/node_modules/orchestrator/index.js:273:3)
at Gulp.Orchestrator._runStep (/home/vagrant/Code/bookcafe100.com/node_modules/orchestrator/index.js:214:10)
at Gulp.Orchestrator.start (/home/vagrant/Code/bookcafe100.com/node_modules/orchestrator/index.js:134:8)
at runNextSet (/home/vagrant/Code/bookcafe100.com/node_modules/run-sequence/index.js:86:16)

한참 삽질하다가 Elixir version is messing up 라는 글에서 ‘public/build/rev-manifest.json 파일이 아래와 같이 되어 있기 때문이라는 걸 알았습니다.

{
"js/app.js": "js/app-e81f312e80.js"
}s"
}

아직까지 rev-manifest.json 파일이 왜 저리 되었는지 원인은 못찾아냈습니다만, 문제를 유발하는 s” } 를 지우니 빌드가 됐습니다. 아오 답답해서 혼났네요.

 

leaderboard-728x90