DEV Community

Arvind Choudhary
Arvind Choudhary

Posted on

Docker Image of your Testing Project / Dockerise test execution

Docker image


I previously wrote about docker & testng, how it can be useful? but did you ever feel that why should we keep running tests in complex manner( on local machine/on virtual machine)? Can we make it simple enough for everyone to run tests with ease?!

What if we have a docker-image of our test code which when executed will test our app. you just have to do docker run <image-name> and that's it. your scripts shall trigger inside container and on completion you should be able to get test status on console!

Few advantages:

  1. Anyone can execute scripts & get test results.
  2. Development/Testing knowledge is not required.
  3. Test execution is completely isolated.

Github repo: Arvind142/TestNG-Modular-Automation-Framework


Start with creating test suite, verifying POM!

testng.xml



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Suite">
<!-- Listeners to help with reporting -->
<listeners>
<!-- Listener Class declaration -->
</listeners>
<test name="Test">
<packages>
<!-- test package declaration -->
<package name="com.core.test_package.*"></package>
</packages>
</test> <!-- Test -->
</suite> <!-- Suite -->

Enter fullscreen mode Exit fullscreen mode




Pom.xml




<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>

Enter fullscreen mode Exit fullscreen mode




Trigger them to Verify it's working.

mvn clean test -Dsurefire.suiteXmlFiles=/path/to/testng.xml


Create image of your code

Dockerfile


Base image

FROM maven:3.8.5-openjdk-11-slim

Argument with default value

ARG suiteFile=testng.xml

Copy code from local to image

COPY ./ /app

Specify working directory

WORKDIR /app

Execute command at creation of image

RUN mvn clean compile

Command to be executed at start of container

CMD mvn test -Dsurefire.suiteXmlFiles=$suiteFile -e

Enter fullscreen mode Exit fullscreen mode




Build your image

docker build -t arvindc142/framework:v1 .

Build SS


Run you image

docker run arvindc142/framework:v1

Run different test suite (other than testng.xml, which was metioned as default suite)

docker run -e suiteFile=testng-karate.xml arvindc142/framework:v1

Remember to publish image to image repo so that it is available for others to leverage.

docker image push arvindc142/framework:v1


What about test reports?

since tests were executed in container then reports are within container, how can i get them? Volume Mapping

Volume Mapping

Volumes are the preferred mechanism for persisting data generated by and used by Docker containers. While bind mounts are dependent on the directory structure and OS of the host machine, volumes are completely managed by Docker.

Note: In my case reports are generated in test-output folder, I’ll map test-output of my image with my machine’s folder (i.e., test-results) so that I can get test result there! (Use PowerShell on windows)

docker run -v $PWD/test-results:/app/test-output arvindc142/framework:v1

Before Snapshot:

Before SS

After executing docker run with -v option:

After ss

RPT


BONUS!!!

Let’s add selenium grid with code for UI test script execution.

above setup were only for test execution it didn’t cover selenium-based UI script execution.

Note: Remote url will be http://selenium-hub:4444/wd/hub inside framework container.

Container can connect to hub container with host as selenium-hub, i’ve also exposed port 4444 to watch script execution from your machine. you can access hub with http://localhost:4444/ui

Hub Snapshot:

grid

Docker-compose for Selenium grid and our test script execution



version: '3.7'

compose version details

services:
#-SELENIUM GRID SETUP FOR AUTOMATION EXECUTION-
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- 4444:4444
chrome:
image: selenium/node-chrome:latest
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:latest
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:latest
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
#-SELENIUM GRID services ended-

#-Framework image-
# service name(container name)
modular-automation-framework:
# which container to use for building
image: arvindc142/framework:v1
# to copy project into container
volumes:
- './test-results/:/app/test-output/'

Enter fullscreen mode Exit fullscreen mode




To spin up all containers

docker-compose up -d

spin up

Get all containers

docker ps -a

Print container logs on console

you can get container-id’s with docker ps command
docker logs -f <container-id>

To stop & remove containers

docker-compose down

Close DOwn


References

Run TestNG from commandline

Github TestNG Project

Volume Mapping

Docker-Selenium

docker hub arvindc142/framework

Top comments (0)