Mac에서 Docker로 개발환경 구성시, Internet Explorer로 테스트하는 방법

모든 웹브라우저가 다 똑같이 동작하면 참 감사할텐데, 실상은 그렇지 않죠. 특히 IE! 뭐 어쩌겠습니까. 고객님들이 쓰는 주요 브라우저는 다 테스트 해봐야지요.

Mac을 사용하는 개발자들의 문제는 Mac에 IE가 설치되지 않는다는 점입니다. 다행히 모던 PHP 유저 그룹의 a2님으로부터 VirtualBox의 가상 머신으로 도커 머신에 접근하는 방법을 배울 수 있었습니다. 저만 배우고 입 싹 닦을 순 없으니 방법을 정리해서 공유합니다.

Virtualbox 네트워크 만들기

virtualbox를 실행하고 ‘전역도구’에서 호스트 네트워크 관리자를 선택합니다. 만들기를 클릭해서 호스트 네트워크를 하나 만듭니다. 성공하면 위와 같이 네트워크가 하나 만들어집니다.

가상 머신에 네트워크 연결

사용할 윈도우 가상 머신 설정으로 들어가서 네트워크에 ‘호스트 전용 어댑터’로 방금 만든 네트워크를 추가해줍니다.

윈도우 host 설정

virtualbox로 윈도우를 띄웁니다. 윈도우에서 테스트할 도메인을 앞서 만든 네트워크에 연결합니다. 예를 들어, 윈도우10인 경우, c:\windows\system32\drivers\etc\hosts 파일을 열고 아래의 내용을 추가합니다. 아래의 IP주소는 앞서 만든 vboxnet0의 IP입니다. 여러분은 여러분 것을 사용하시면 됩니다.

192.168.56.1 dev.example.com

도커 포트 설정

도커로 개발환경을 띄울 때 포트에 192.168.56.1:80:80을 추가해서 띄워줍니다. 저는 docker-compose를 사용하기 때문에 아래와 같이 docker-compose.yml 파일에서 ports에 한 줄 추가해주면 되었습니다.

이렇게하면 virtualbox로 띄운 윈도우에서 dev.example.com 접속시 호스트 컴퓨터의 도커 머신으로 접속하게 됩니다.

모쪼록 크로스 브라우징 작업에 조금이나마 스트레스가 줄길 바랍니다. 🙂

Chromium으로 스크린 캡쳐를 했는데 한글이 네모로 나오는 경우

자동으로 스크린샷을 저장하기 위해 Browsershot을 사용했다. 그런데, 한글이 제대로 표시되지 않아서 한참 삽질했다. 다행히 포기하기 직전에 기적적으로 해결 방법을 발견했다. 원래는 일본어가 동일한 증상으로 표현이 안되는 문제에 대한 글인데, 답변자가 친절하게도 한글 해결책도 함께 제시해줬다. 결론은 ttf-unfonts-core를 설치해주면된다.

sudo apt-get install ttf-unfonts-core

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