2015-09-05 24 views
7

Đối với thực hiện các bài kiểm tra tôi thường chạy một container riêng biệt với:Chạy thử nghiệm django với selen trong Docker

docker-compose run --rm web /bin/bash 

đâu web là một container với django. Từ một trình bao, tôi thực thi py.test theo thời gian.

Để có thể tiếp cận selen từ thùng chứa với django và để cho phép trình duyệt từ vùng chứa selen để truy cập máy chủ cuộc sống của django, tôi đã quyết định sử dụng tham số "net" cho phép vùng chứa chia sẻ lưới. Vì vậy, tôi đã thêm nó vào yml:

selenium: 
    image: selenium/standalone-firefox 
    net: "container:web" 

Thật không may điều này không hoạt động. Tôi không thấy cổng 4444 trong thùng chứa django của tôi.

Chỉ hoạt động nếu thay vì net:"container:web" Tôi chỉ định tên của vùng chứa tự động phát, như net:"container:project_web_run_1".

Ngoài ra, tôi đã thử thay vì docker-compose run --rm .... sử dụng docker-compose up --no-deps thay đổi thông số command thành py.test functional_tests nhưng điều đó cũng không hoạt động.

Đây có phải là quyền sử dụng selen có chứa không?

Trả lời

5

Đây là cách tôi thực hiện. Vấn đề cơ bản là chạy docker-compose sẽ tạo ra một hostname khác (project_container_run_x) trong đó x rất khó để biết chắc chắn. Tôi đã kết thúc chỉ đi ra khỏi địa chỉ ip. Tôi cũng đảm bảo DEBUG là False nếu không tôi nhận được một yêu cầu xấu.

Tôi đang sử dụng StaticLiveServerTestCase như thế này:

import os 
import socket 

os.environ['DJANGO_LIVE_TEST_SERVER_ADDRESS'] = '0.0.0.0:8000' 

class IntegrationTests(StaticLiveServerTestCase): 
    live_server_url = 'http://{}:8000'.format(
     socket.gethostbyname(socket.gethostname()) 
    ) 

    def setUp(self): 
     settings.DEBUG = True 
     self.browser = webdriver.Remote(
      command_executor="http://selenium:4444/wd/hub", 
      desired_capabilities=DesiredCapabilities.CHROME 
     ) 

    def tearDown(self): 
     self.browser.quit() 
     super().tearDown() 

    def test_home(self): 
     self.browser.get(self.live_server_url) 

tập tin Docker-soạn của tôi có điều này cho selen và mở rộng những trang web chứa (nơi django đang chạy). Cổng 5900 mở cho VNC. Tôi muốn giữ cô lập này trong một cái gì đó giống như Docker-compose.selenium.yml

version: '2' 
services: 
    web: 
    environment: 
     SELENIUM_HOST: http://selenium:4444/wd/hub 
     TEST_SELENIUM: 'yes' 
    depends_on: 
     - selenium 

    selenium: 
    image: selenium/standalone-chrome-debug 
    ports: 
     - "5900:5900" 

tôi có thể chạy thử nghiệm như

docker-compose run --rm web ./manage.py test 

Vì vậy, thùng chứa web của tôi đang truy cập selen qua "selen" chủ. Selenium sau đó truy cập vào các container web bằng địa chỉ ip được xác định trên bay.

Một hình ảnh xác thực khác là bạn chỉ nên sử dụng "web" làm tên máy chủ. Nếu lệnh chạy docker-compose của bạn khởi động một thùng chứa web riêng biệt - điều này sẽ xuất hiện để hoạt động. Tuy nhiên nó sẽ không được sử dụng cơ sở dữ liệu thử nghiệm của bạn, làm cho không phải là một thử nghiệm tuyệt vời.

+1

Bạn cũng có thể đặt URL máy chủ trong môi trường, do đó bạn không phải chuyển nó trên dòng lệnh mỗi lần, bằng cách đặt 'DJANGO_LIVE_TEST_SERVER_ADDRESS'. –

0

Tôi vừa chỉ định host='web' cho LiveServerTestCase. Đây là giải pháp làm việc của tôi.

test.py

from django.test import LiveServerTestCase 
from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 

class FunctionalTestCase(LiveServerTestCase): 
    host = 'web' 
    def setUp(self): 
     self.browser = webdriver.Remote(
      command_executor="http://selenium:4444/wd/hub", 
      desired_capabilities=DesiredCapabilities.FIREFOX 
     ) 

    def test_user_registration(self): 
     self.browser.get(self.live_server_url) 
     self.assertIn('Django', self.browser.title) 

    def tearDown(self): 
     self.browser.close() 

docker-compose.yml

version: '3' 
services: 
    db: 
    image: postgres 
    web: 
    build: . 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 
     - selenium 
    selenium: 
    image: selenium/standalone-firefox 
0

Trong trường hợp của tôi, "web" container chạy chỉ có một lệnh, đó là bash -c "sleep infinity".

Sau đó, tôi bắt đầu toàn bộ ngăn xếp với docker-compose up -d.Ví dụ:

Sau đó, tôi sử dụng docker-compose exec web bash -c "cd /usr/src/app && tox".

Bằng cách này, máy chủ web của tôi có thể truy cập từ selenium, luôn dưới cùng một tên.

Sử dụng docker-compose run web ... tạo tên máy chủ mới (có thể dự đoán, nhưng vẫn) mỗi lần duy nhất.

Các vấn đề liên quan