Skip to content

Commit

Permalink
Docker first commit (#24)
Browse files Browse the repository at this point in the history
### To be filled by the PR creator:

* A brief description of the changes made - 

* Do we have clean latest run report attached with this PR?
  * [ ] Yes
  * [ ] No (Please explain why)

* Does the PR contain changes to any BP core file?
  * [ ] Yes (Needs approval from at least 2 people)
  * [ ] No

* Does the PR contain changes to modules shared with other teams?
* [ ] Yes (Needs approval from at least one of the other teams that use
the module)
  * [ ] No

* Is it
  * [ ] New Testcase
  * [ ] Fix


### To be filled by the PR reviewer:

* [ ] Verify the attached run report passed in GitHub Actions (Justify
if local run)

* General
    * [ ] Use the best strategy to locate the elements
    * [ ] Comments wherever the code is not readable by itself
    * [ ] Use of the right data structure for the use case
    * [ ] Reuse logic/functionality as much as possible
    * [ ] Cleanup of any test data that is generated by the tests
    * [ ] No static waits
  • Loading branch information
Tauqir Sarwar authored Mar 18, 2024
2 parents 6a250ed + 32ff499 commit 3d04be2
Show file tree
Hide file tree
Showing 7 changed files with 321 additions and 1 deletion.
224 changes: 224 additions & 0 deletions .github/workflows/docker_workflow.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
name: Docker Web UI Tests

env:
TAGS: web_tests
BASE_URL: https://opensource-demo.orangehrmlive.com
HRM_USER_NAME: ${{ secrets.HRM_USER_NAME }}
HRM_PASSWORD: ${{ secrets.HRM_PASSWORD }}
USING_DOCKER: True

on:
schedule:
- cron: '30 22 * * *'
workflow_dispatch:
inputs:
tags:
description: Gherkin Tags
required: true
default: web_tests

baseurl:
description: Base URL
required: true
type: choice
default: https://opensource-demo.orangehrmlive.com
options:
- https://opensource-demo.orangehrmlive.com
- other

inputurl:
description: Other than default Base URL (e.g portal url)
required: true
default: https://opensource-demo.orangehrmlive.com

browser:
description: Browser Name
required: true
type: choice
default: chrome
options:
- chrome
- firefox
- edge

jobs:
web-scheduled-regression:
if: github.event_name == 'schedule'
strategy:
max-parallel: 1
fail-fast: false
matrix:
include:
- name: Linux Chrome
baseurl: https://opensource-demo.orangehrmlive.com
tags: web_tests
config_file: ./configs/docker_chrome.json
html_report: linux-chrome
concurrent_thread: 1

- name: Linux Firefox
baseurl: https://opensource-demo.orangehrmlive.com
tags: web_tests
config_file: ./configs/docker_firefox.json
html_report: linux-firefox
concurrent_thread: 1

- name: Linux Edge
baseurl: https://opensource-demo.orangehrmlive.com
tags: web_tests
config_file: ./configs/docker_edge.json
html_report: linux-edge
concurrent_thread: 1

name: ${{ matrix.name }} - Regression
runs-on: ubuntu-latest
steps:
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.9"

- name: Set up Docker
id: docker_env_setup
if: steps.validate_input.outcome == 'success'
uses: docker/setup-buildx-action@v3

- name: Build and start Docker Compose services
id: docker_compose
if: steps.docker_env_setup.outcome == 'success'
run: |
docker-compose -f docker-compose.yml up -d
- name: Wait for services to start
run: sleep 30

- name: Check out code
id: co_code
if: steps.docker_compose.outcome == 'success'
uses: actions/checkout@v4

- name: Setup dependencies
run: |
sh install.sh
- name: Run All Tests
run: |
env
source $HOME/.bp-venv/bin/activate
python -m pytest -v --driver Remote --selenium-host 'localhost' --selenium-port '4444' \
--variables ${{ matrix.config_file }} --tags="${{ matrix.tags }}" \
--base-url="${{ matrix.baseurl }}" \
--reruns 1 --reruns-delay 5 \
--html=report.html \
--self-contained-html \
- name: Upload HTML run report in the Artifacts Folder
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.html_report }}
path: |
./*.html
./output/
./assets/
if: ${{ always() }}

docker-web-manual-run:
if: github.event_name != 'schedule'
name: Manual - ${{ inputs.browser }} - ${{ inputs.tags }} - ${{ inputs.baseurl }}
runs-on: ubuntu-latest
steps:
- name: Validate Input Parameter
id: validate_input
run: |
if [[ -z "${{ github.event.inputs.tags }}" ]]; then
echo "Invalid input: 'tags' is required but not provided."
exit 1
fi
if [[ -z "${{ github.event.inputs.baseurl }}" ]]; then
echo "Invalid input: 'baseurl' is required but not provided."
exit 1
fi
if [[ -z "${{ github.event.inputs.browser }}" ]]; then
echo "Invalid input: 'browser' is required but not provided."
exit 1
fi
- name: Setup Python
id: setup_python
if: steps.validate_input.outcome == 'success'
uses: actions/setup-python@v5
with:
python-version: "3.9"

- name: Set up Docker
id: docker_env_setup
if: steps.validate_input.outcome == 'success'
uses: docker/setup-buildx-action@v3

- name: Build and start Docker Compose services
id: docker_compose
if: steps.docker_env_setup.outcome == 'success'
run: |
docker-compose -f docker-compose.yml up -d
- name: Wait for services to start
run: sleep 30

- name: Check out code
id: co_code
if: steps.docker_compose.outcome == 'success'
uses: actions/checkout@v4

- name: Setup dependencies
id: setup_dependencies
if: steps.docker_compose.outcome == 'success'
run: |
sh install.sh
- name: Run Manual Job Tests
id: run_manual_job
if: steps.setup_dependencies.outcome == 'success'
run: |
TAGS="${{ github.event.inputs.tags }}"
if [[ "${{ github.event.inputs.baseurl }}" == "other" ]]; then
BASE_URL="${{ github.event.inputs.inputurl }}"
else
BASE_URL="${{ github.event.inputs.baseurl }}"
fi
number_of_threads=1
if [[ "${{ github.event.inputs.browser }}" == "chrome" ]]; then
BROWSER=./configs/docker_chrome.json
fi
if [[ "${{ github.event.inputs.browser }}" == "firefox" ]]; then
BROWSER=./configs/docker_firefox.json
fi
if [[ "${{ github.event.inputs.browser }}" == "edge" ]]; then
BROWSER=./configs/docker_edge.json
fi
env
source $HOME/.bp-venv/bin/activate
python -m pytest -v --driver Remote \
--selenium-host 'localhost' --selenium-port '4444' \
--variables "$BROWSER" \
--reruns 1 --reruns-delay 5 \
--tags="$TAGS" --base-url="$BASE_URL" --html=report.html \
--self-contained-html
- name: Upload HTML run report in the Artifacts Folder
uses: actions/upload-artifact@v4
with:
name: pytest-html-results
path: |
./*.html
./output/
./assets/
if: ${{ always() }}
22 changes: 21 additions & 1 deletion bp_core/frontend/frontend_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ def chrome_options(chrome_options, variables, proxy_url, env_variables, request)
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--window-size=1367,768")
if os.environ.get("USING_DOCKER", False) and os.environ.get("SERVER", "") == "Docker":
if os.environ.get("USING_DOCKER", False) == 'True':
chrome_options.add_argument("--ignore-certificate-errors")
if proxy_url:
chrome_options.add_argument("--ignore-certificate-errors")
Expand Down Expand Up @@ -272,6 +272,26 @@ def driver_kwargs(capabilities, host, port, **kwargs):

appium.driver_kwargs = driver_kwargs

elif os.environ.get("USING_DOCKER", "False") == 'True':
value, options = driver_options_factory
for k, v in session_capabilities.items():
options.set_capability(k, v)

def driver_kwargs(capabilities, host, port, **kwargs): # noqa
_ = capabilities
if value in ("chrome", "edge", "firefox"):
browser_options = kwargs.get(f"{value}_options", None)
browser_options_arguments = getattr(browser_options, "arguments", [])
browser_options_capabilities = getattr(browser_options, "capabilities", {})
options.capabilities.update(browser_options_capabilities)
options.arguments.extend([x for x in browser_options_arguments if x not in options.arguments])

executor = f"http://{host}:{port}/wd/hub"
kwargs = {"command_executor": executor, "options": options}

return kwargs

remote.driver_kwargs = driver_kwargs

# Define selenium generics as a fixture
# This is UI specific implementation
Expand Down
10 changes: 10 additions & 0 deletions configs/docker_chrome.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"capabilities": {
"browserName": "chrome",
"timeouts": {
"implicit": 30000,
"pageLoad": 30000,
"script": 30000
}
}
}
10 changes: 10 additions & 0 deletions configs/docker_edge.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"capabilities": {
"browserName": "MicrosoftEdge",
"timeouts": {
"implicit": 30000,
"pageLoad": 30000,
"script": 30000
}
}
}
10 changes: 10 additions & 0 deletions configs/docker_firefox.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"capabilities": {
"browserName": "firefox",
"timeouts": {
"implicit": 30000,
"pageLoad": 30000,
"script": 30000
}
}
}
42 changes: 42 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# To execute this docker-compose yml file use `docker-compose -f docker-compose.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker-compose -f docker-compose.yml down`
version: "3"
services:
chrome:
image: selenium/node-chrome:4.18.0-20240220
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:4.18.0-20240220
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:4.18.0-20240220
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-hub:
image: selenium/hub:4.18.0-20240220
container_name: selenium-hub
ports:
- "4442:4442"
- "4443:4443"
- "4444:4444"
4 changes: 4 additions & 0 deletions web_local_run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/sh

# Run API tests
python -m pytest -v -s --gherkin-terminal-reporter --driver=Chrome --html="./output/reports/" --self-contained-html --capability headless True --reruns 1 --reruns-delay 2 --tags="web_tests" -n 2

0 comments on commit 3d04be2

Please sign in to comment.