使用Pytest,Selenium Grid和Docker创buildtesting基础架构

基于这篇文章 ,我成功地创build了可扩展的selenium网格。 然后,我想运行我的testing套件(用Python编写),使用Pytest进入该网格。

我是Docker的新手,并试图find将我的testing过程迁移到微服务体系结构的最佳方法。 本质上,我想让开发人员能够在PC上本地设置完整的testing基础架构。

所以,我有4个Dockerfiles和1 个docker-compose.yml

BASE dockerfile:

FROM ubuntu ENV SEL_VERSION 2.44.0 # Update repos for Java RUN apt-get update -qqy \ && apt-get -qqy --no-install-recommends install \ software-properties-common \ && rm -rf /var/lib/apt/lists/* RUN add-apt-repository -y ppa:webupd8team/java RUN echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections RUN echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections # Install Java7 RUN apt-get update -qqy \ && apt-get -qqy --no-install-recommends install \ oracle-java7-installer \ && rm -rf /var/lib/apt/lists/* # Download Selenium Server RUN wget http://selenium-release.storage.googleapis.com/${SEL_VERSION%.*}/selenium-server-standalone-${SEL_VERSION}.jar 

HUB dockerfile:

 FROM org/grid:base EXPOSE 4444 # Add and set permissions to the script that will launch the hub ADD register-hub.sh /var/register-hub.sh RUN chmod 755 /var/register-hub.sh # start a shell and run the script #WORKDIR / CMD ["/bin/bash", "/var/register-hub.sh"] 

NODE dockerfile:

 FROM org/grid:base # set the FF version to use ENV FIREFOX_MINOR 34.0.5 # Update and install what's needed RUN apt-get update -qqy \ && apt-get -qqy --no-install-recommends install \ firefox \ xvfb \ bzip2 \ && rm -rf /var/lib/apt/lists/* # setup FF RUN [ -e /usr/bin/firefox ] && rm /usr/bin/firefox ADD https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/${FIREFOX_MINOR}/linux-x86_64/en-US/firefox-${FIREFOX_MINOR}.tar.bz2 /tmp/ RUN apt-get install -q -y libdbus-glib-1-2 RUN tar -xvjf /tmp/firefox-${FIREFOX_MINOR}.tar.bz2 -C /opt/ RUN chmod -R +x /opt/firefox/ RUN ln -s /opt/firefox/firefox /usr/bin/firefox # add and set permissions for the bash script to register the node ADD register-node.sh /var/register-node.sh RUN chmod 755 /var/register-node.sh # start a shell and run the script CMD ["/bin/bash", "/var/register-node.sh"] 

和PYTEST dockerfile:

 # Starting from base image FROM ubuntu # Set the Github personal token [to clone the QA code] #todo------secret------ ENV GH_TOKEN some_token_some_token_some_token_ # Install Python & pip RUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y python python-pip python-dev && pip install --upgrade pip # Install GIT RUN apt-get update -y && apt-get install git -y # [in the / folder] Create the folder and add the whole project from the repo to the container RUN git clone https://$GH_TOKEN:x-oauth-basic@github.com/org/org_QA.git /org_QA_folder # Install dependencies via pip WORKDIR /org_QA_folder RUN pip install -r dependencies.txt # CMD /bin/bash 

而docker-compose文件:

 hub: image: org/grid:hub # image must already exist ports: - "4444:4444" # HOST:CONTAINER external_links: # link to a container created outside of this YAML file - pytest volumes_from: - pytest # must be created first firefox: image: org/grid:nodeff # image must already exist links: - hub expose: - "5555" # grid console open to public 

所以…我不明白我应该如何运行像“py.test /org_QA_folder/testcase.py”并运行在网格[本质上的节点]。

我首先运行docker docker run -dit -v /org_QA_folder --name pytest schoox/grid:py和其他服务与docker-compose up -d的pytest容器。

我尝试了多种方法:

  1. 不要使用Pytest容器,而要在集线器中克隆代码。 但是在这种情况下,HUB容器运行网格的集线器[每个容器指令一个CMD]。 [编辑:我select了Dockerbuild议的微服务架构]

  2. 我离开集线器和节点容器运行他们指定的服务,并创build一个单独的容器[pytest]从那里发送testing。 但testing不会运行,因为这个容器没有xvfb。 [编辑:我刚安装xvfb和工作]

  3. 我试图使用pytest容器作为集线器的卷,但仍然是运行已经有服务运行的集线器容器的testing的问题。 [编辑:为了开发的目的,我从pytest容器中安装代码,并使用其控制台来testing其他容器上的东西。 之后,我将使用pytest容器分开代码]

我应该在其他容器中安装该节点容器所有的软件包吗? 理想情况下,我想使用pytest容器控制台[至less开发基础设施]来运行将发送到集线器并运行到许多节点的testing。 [编辑:我没有混合集线器和节点,我只是在pytest容器上安装xvfb]

你会如何build议这样做? 我错过了什么吗?

编辑[解决scheme的步骤]:

我首先启动pytest容器[docker docker run -dit -v /org/org_QA_folder --name pytest org/grid:py ],然后运行docker-compose up -d启动网格

在撰写文件中,我使用external_linksvolumes_from作为开发目的。 安装完成后,我不会在任何容器内工作。

我改变了Pytest dockerfile并添加了这个:

 # Install xvfb [THAT WAS NEEDED!!!!!] RUN apt-get install -y xvfb 

我从pytest容器中运行我的一个testing,到我已经运行的Grid(在EC2实例上),作为概念certificate,并且工作正常。 它仍然是发送到dockerized网格。

我想你快到了。

我会将一个pytest服务添加到pytest docker-compose.yml ,并从hub映像中删除volumes_fromexternal_links (这样看起来更像是链接的博客文章中的示例)。

pytest服务将运行python代码,但它应该连接到集线器来运行selenium。 我相信在org_QA_folder某个地方有configuration,试图在本地启动selenium。 需要重新configuration才能使用hub服务器。

我终于这样做了:

从我的代码我使用这个:

 class Fixtures_docker(unittest.TestCase): def setUp(self, hub_ip="http://HUB_CONTAINER_IP", hub_port=4444): print "--Fixtures_docker in config.py trying to run on--: %s:%s"%(hub_ip, hub_port) if platform.system() == 'Linux': from pyvirtualdisplay import Display self.display = Display(visible=0, size=(1024, 768)) self.display.start() if browser == "Firefox": self.wd = webdriver.Remote( command_executor=hub_ip + ':' + str(hub_port) + '/wd/hub', desired_capabilities={ #FIREFOX "browserName" : "firefox", # "maxInstances" : 10, "seleniumProtocol": "WebDriver", "platform" : "ANY", "node" : hub_port }) # for debugging purposes from local machine elif browser == "Firefox" and os == "Windows": self.wd = webdriver.Remote( command_executor=hub_ip + ':' + str(hub_port) + '/wd/hub', desired_capabilities={ # FIREFOX -> WINDOWS # "firefox_binary":"C:\\firefox3\Firefox3.exe", # path to find another version of ff "browserName" : "firefox", #"version" : "3.0b3", # trying to run a specific ff version "platform" : "WINDOWS", "node" : hub_port, "maxSession" : 5 }) self.wd.implicitly_wait(10) def tearDown(self): self.wd.quit() if platform.system() == 'Linux': self.display.stop() 

并在docker-compose.yml中:

 hub: image: org/grid:hub # image must already exist ports: - "8080:4444" # HOST:CONTAINER external_links: # link to a container created outside of this YAML file - pytest volumes_from: - pytest # must be created first expose: - "4444" # intercontainer communication [other containers with selenium server] firefox: image: org/grid:nodeff # image must already exist links: - hub expose: - "5555" # intercontainer communication [node registers to hub]