리셋 되지 말자

docker django selenium 테스트 - 2 본문

TDD

docker django selenium 테스트 - 2

kyeongjun-dev 2021. 7. 21. 11:52

이전 selenuim을 이용한 테스트의 한계

- https://not-to-be-reset.tistory.com/455?category=935991

위 글에서 local에 chrome 웹 드라이버를 별도로 설치하고, python의 selenium을 이용해 실제 브라우저에서 App이 어떻게 동작하는지를 테스트 했다.

그런데 이렇게 하려면, local에 webdriver가 무조건 설치되어 있어야 한다. 즉, Docker로 개발하면 컨테이너 내부에서 selenium이 동작해야 하는데 동작을 위해서는 webdriver가 컨테이너에도 설치되어 있어야 한다.

컨테이너 내부에 webdriver를 다운로드 받는것도 생각했었는데, 별로 우아하지 않은 것 같다.

생각해낸 방법

웹 브라우저를 별도로 컨테이너로 띄운 다음, docker-compose로 django 컨테이너와 묶어주면 될것 같다는 생각을 한 찰나, 역시 세상은 넓고 개발자는 많다. 구성해보고 싶은 형태의 프로젝트를 Github에서 발견

https://github.com/marcgibbons/django-selenium-docker

이를 참고하여 구성했다.

구성

정상 동작을 2021년 7월 21일에 확인

- docker-compose.yml

version: "3"

services:
    django:
        build:
            context: .
        image: docker_tutorial_django
        stdin_open: true
        tty: true
        ports: 
            - 8000:8000
        environment: 
            - TZ=Asia/Seoul
        command: >
            bash -c "
            chmod +x ./wait-for-it.sh
            && ./wait-for-it.sh db:5432 -t 10
            && python manage.py makemigrations
            && python manage.py migrate
            && python manage.py runserver 0.0.0.0:8000"

    db:
        image: postgres
        ports:
            - 5432:5432
        environment: 
            - TZ=Asia/Seoul
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
        restart: always

    chrome:
        image: selenium/standalone-chrome:4.0.0-rc-1-prerelease-20210618 # vnc로 selenium 동작 확인가능 :7900 port
        # image: selenium/standalone-chrome # vnc가 없는 이미지. 
        expose:
            - 4444

        # vnc 미사용시 7900 포트 불필요
        ports:
            - 7900:7900

        # 리소스 제한 시, 'docker-compose --compatibility up' 사용
        # deploy:
        #     resources:
        #         limits:
        #             cpus: '0.5'

django, postgres, chrome 총 3개의 docker 컨테이너로 이루어진다. 자세한 코드는 깃허브 참고

실행

1. git clone 을 받고, docker-compose up 실행

2. localhost:8000 접속

 

3. Name과 Height에 값 입력 후 Enter

 

4. localhost:7900 접속 - 연결 비밀번호 : secret

 

5. django container 접속

$ docker exec -it django-selenium-post-action-test-postgres_django_1 bash
root@31ba03b129d3:/var/www/myproject#

 

6. test 시작 - app/tests.py 에 테스트 코드 존재

root@31ba03b129d3:/var/www/myproject# python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 2.837s

OK
Destroying test database for alias 'default'...

빠르게 지나가지만, VNC에서 브라우저가 생성되고 테스트가 수행됨

 

7. localhost:8000 화면 새로고침

테스트 케이스를 수행하여 생성된 'test-name2, 170'을 확인할 수 있음

 

후기

dind 에서 selenium을 돌려야 해서 이러한 방법을 적용함. 좋은 방법인지는 판단을 하지 못하겠음.
host에 웹 드라이버를 설치할 필요가 없는건 좋은 점인거 같음.

 

참고

- https://github.com/SeleniumHQ/docker-selenium

Comments