Compare commits

...
12 Commits
Author SHA1 Message Date
butomo1989 0e578710f3 Automated all steps from PR #12 2017-06-14 15:06:01 +02:00
butomo1989 65df456066 Using docker-appium as base image 2017-06-14 15:04:19 +02:00
butomo1989 5b694c2c55 Fixed issue #13 regarding arm image for 6.0 2017-06-09 11:59:07 +02:00
AndrejsandBudi Utomo 6406504f94 Possibility to run appium with custom chromedriver executable (#12)
* Possibility to run appium with custom chromedriver executable
* Unit test added
* README update
2017-06-09 10:44:58 +02:00
butomo1989 b7c4538896 Downgraded selenium to be able to run E2E Tests 2017-06-02 16:55:51 +02:00
butomo1989 c7d988bd61 Refactored 2017-06-02 15:30:51 +02:00
butomo1989 47e968927a Updated Sample and End2End Tests 2017-06-02 14:49:55 +02:00
butomo1989 dcf196ec4a Run E2E Tests only if needed 2017-06-02 13:18:00 +02:00
butomo1989 aff1b062e1 Added End-2-End Test 2017-06-02 12:14:14 +02:00
butomo1989 59f6e4bd33 Mocked os package in unit tests to clear all warning messages 2017-05-30 17:25:07 +02:00
butomo1989 0b9af7e6b2 Using git tag for same docker images 2017-05-30 16:28:28 +02:00
butomo1989 d9b5f8d86c Using latest version of build tool 2017-05-30 16:26:09 +02:00
16 changed files with 256 additions and 171 deletions
+12 -49
View File
@@ -1,6 +1,6 @@
FROM ubuntu:16.04 FROM appium/appium:1.6.6-beta-p0
ENV DEBIAN_FRONTEND noninteractive LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
#============= #=============
# Set WORKDIR # Set WORKDIR
@@ -10,29 +10,15 @@ WORKDIR /root
#================== #==================
# General Packages # General Packages
#------------------ #------------------
# wget
# Network downloader
# unzip
# Unzip zip file
# curl
# Transfer data from or to a server
# xterm # xterm
# Terminal emulator # Terminal emulator
# supervisor # supervisor
# Process manager # Process manager
# openjdk-8-jdk
# Java
# libqt5webkit5
# Web content engine (Fix issue in Android)
# socat # socat
# Port forwarder # Port forwarder
# libgconf-2-4
# Required package for chrome and chromedriver to run on Linux
#------------------ #------------------
# NoVNC Packages # NoVNC Packages
#------------------ #------------------
# xvfb
# X virtual framebuffer
# x11vnc # x11vnc
# VNC server for X display # VNC server for X display
# openbox # openbox
@@ -45,16 +31,9 @@ WORKDIR /root
# Netstat # Netstat
#================== #==================
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \ RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
wget \
unzip \
curl \
xterm \ xterm \
supervisor \ supervisor \
openjdk-8-jdk \
libqt5webkit5 \
socat \ socat \
libgconf-2-4 \
xvfb \
x11vnc \ x11vnc \
openbox \ openbox \
menu \ menu \
@@ -79,52 +58,36 @@ RUN wget -nv -O noVNC.zip "https://github.com/kanaka/noVNC/archive/${NOVNC_SHA}
&& rm websockify.zip \ && rm websockify.zip \
&& ln noVNC/vnc_auto.html noVNC/index.html && ln noVNC/vnc_auto.html noVNC/index.html
#=====================
# Install Android SDK
#=====================
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre
ENV PATH ${PATH}:${JAVA_HOME}/bin
ENV SDK_VERSION=25.2.3 \
ANDROID_HOME=/root
RUN wget -nv -O android.zip https://dl.google.com/android/repository/tools_r${SDK_VERSION}-linux.zip \
&& unzip android.zip && rm android.zip
ENV PATH ${PATH}:${ANDROID_HOME}/tools
RUN echo y | android update sdk --no-ui -a --filter platform-tools
ENV PATH ${PATH}:${ANDROID_HOME}/platform-tools
#====================================
# Install latest nodejs, npm, appium
#====================================
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - \
&& apt-get -qqy update && apt-get -qqy install nodejs && rm -rf /var/lib/apt/lists/*
ENV APPIUM_VERSION 1.6.3
RUN npm install -g appium@$APPIUM_VERSION && npm cache clean
#====================== #======================
# Install SDK packages # Install SDK packages
#====================== #======================
ARG ANDROID_VERSION=5.0.1 ARG ANDROID_VERSION=5.0.1
ARG BUILD_TOOL=25.0.3
ARG API_LEVEL=21 ARG API_LEVEL=21
ARG PROCESSOR=x86 ARG PROCESSOR=x86
ARG SYS_IMG=x86_64 ARG SYS_IMG=x86_64
ARG IMG_TYPE=google_apis ARG IMG_TYPE=google_apis
ARG BROWSER=android ARG BROWSER=android
ENV ANDROID_VERSION=$ANDROID_VERSION \ ENV ANDROID_VERSION=$ANDROID_VERSION \
BUILD_TOOL=$BUILD_TOOL \
API_LEVEL=$API_LEVEL \ API_LEVEL=$API_LEVEL \
PROCESSOR=$PROCESSOR \ PROCESSOR=$PROCESSOR \
SYS_IMG=$SYS_IMG \ SYS_IMG=$SYS_IMG \
IMG_TYPE=$IMG_TYPE \ IMG_TYPE=$IMG_TYPE \
BROWSER=$BROWSER BROWSER=$BROWSER
RUN echo y | android update sdk --no-ui -a --filter build-tools-${BUILD_TOOL}
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
RUN rm ${ANDROID_HOME}/tools/emulator \ RUN rm ${ANDROID_HOME}/tools/emulator \
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator && ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL} RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
#==============================================
# Download chrome driver v2.26
# to be able to use chrome browser in emulator
# Issue: https://github.com/butomo1989/docker-android/commit/6406504f944dae73d0a0c5d8e71a17a47dff9b33
#==============================================
RUN wget -nv -O chrome.zip "https://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip" \
&& unzip -x chrome.zip \
&& rm chrome.zip
#================================================ #================================================
# noVNC Default Configurations # noVNC Default Configurations
# These Configurations can be changed through -e # These Configurations can be changed through -e
@@ -165,7 +128,7 @@ COPY src /root/src
COPY supervisord.conf /root/ COPY supervisord.conf /root/
RUN chmod -R +x /root/src && chmod +x /root/supervisord.conf RUN chmod -R +x /root/src && chmod +x /root/supervisord.conf
HEALTHCHECK --interval=2s --timeout=600s --retries=1 \ HEALTHCHECK --interval=2s --timeout=40s --retries=1 \
CMD adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done' CMD adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done'
CMD /usr/bin/supervisord --configuration supervisord.conf CMD /usr/bin/supervisord --configuration supervisord.conf
+11 -48
View File
@@ -1,6 +1,6 @@
FROM ubuntu:16.04 FROM appium/appium:1.6.6-beta-p0
ENV DEBIAN_FRONTEND noninteractive LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
#============= #=============
# Set WORKDIR # Set WORKDIR
@@ -10,29 +10,15 @@ WORKDIR /root
#================== #==================
# General Packages # General Packages
#------------------ #------------------
# wget
# Network downloader
# unzip
# Unzip zip file
# curl
# Transfer data from or to a server
# xterm # xterm
# Terminal emulator # Terminal emulator
# supervisor # supervisor
# Process manager # Process manager
# openjdk-8-jdk
# Java
# libqt5webkit5
# Web content engine (Fix issue in Android)
# socat # socat
# Port forwarder # Port forwarder
# libgconf-2-4
# Required package for chrome and chromedriver to run on Linux
#------------------ #------------------
# NoVNC Packages # NoVNC Packages
#------------------ #------------------
# xvfb
# X virtual framebuffer
# x11vnc # x11vnc
# VNC server for X display # VNC server for X display
# openbox # openbox
@@ -54,16 +40,9 @@ WORKDIR /root
# bridge-utils # bridge-utils
#================== #==================
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \ RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
wget \
unzip \
curl \
xterm \ xterm \
supervisor \ supervisor \
openjdk-8-jdk \
libqt5webkit5 \
socat \ socat \
libgconf-2-4 \
xvfb \
x11vnc \ x11vnc \
openbox \ openbox \
menu \ menu \
@@ -92,52 +71,36 @@ RUN wget -nv -O noVNC.zip "https://github.com/kanaka/noVNC/archive/${NOVNC_SHA}
&& rm websockify.zip \ && rm websockify.zip \
&& ln noVNC/vnc_auto.html noVNC/index.html && ln noVNC/vnc_auto.html noVNC/index.html
#=====================
# Install Android SDK
#=====================
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre
ENV PATH ${PATH}:${JAVA_HOME}/bin
ENV SDK_VERSION=25.2.3 \
ANDROID_HOME=/root
RUN wget -nv -O android.zip https://dl.google.com/android/repository/tools_r${SDK_VERSION}-linux.zip \
&& unzip android.zip && rm android.zip
ENV PATH ${PATH}:${ANDROID_HOME}/tools
RUN echo y | android update sdk --no-ui -a --filter platform-tools
ENV PATH ${PATH}:${ANDROID_HOME}/platform-tools
#====================================
# Install latest nodejs, npm, appium
#====================================
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - \
&& apt-get -qqy update && apt-get -qqy install nodejs && rm -rf /var/lib/apt/lists/*
ENV APPIUM_VERSION 1.6.3
RUN npm install -g appium@$APPIUM_VERSION && npm cache clean
#====================== #======================
# Install SDK packages # Install SDK packages
#====================== #======================
ARG ANDROID_VERSION=5.0.1 ARG ANDROID_VERSION=5.0.1
ARG BUILD_TOOL=25.0.3
ARG API_LEVEL=21 ARG API_LEVEL=21
ARG PROCESSOR=x86 ARG PROCESSOR=x86
ARG SYS_IMG=x86_64 ARG SYS_IMG=x86_64
ARG IMG_TYPE=google_apis ARG IMG_TYPE=google_apis
ARG BROWSER=android ARG BROWSER=android
ENV ANDROID_VERSION=$ANDROID_VERSION \ ENV ANDROID_VERSION=$ANDROID_VERSION \
BUILD_TOOL=$BUILD_TOOL \
API_LEVEL=$API_LEVEL \ API_LEVEL=$API_LEVEL \
PROCESSOR=$PROCESSOR \ PROCESSOR=$PROCESSOR \
SYS_IMG=$SYS_IMG \ SYS_IMG=$SYS_IMG \
IMG_TYPE=$IMG_TYPE \ IMG_TYPE=$IMG_TYPE \
BROWSER=$BROWSER BROWSER=$BROWSER
RUN echo y | android update sdk --no-ui -a --filter build-tools-${BUILD_TOOL}
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
RUN rm ${ANDROID_HOME}/tools/emulator \ RUN rm ${ANDROID_HOME}/tools/emulator \
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator && ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL} RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
#==============================================
# Download chrome driver v2.26
# to be able to use chrome browser in emulator
# Issue: https://github.com/butomo1989/docker-android/commit/6406504f944dae73d0a0c5d8e71a17a47dff9b33
#==============================================
RUN wget -nv -O chrome.zip "https://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip" \
&& unzip -x chrome.zip \
&& rm chrome.zip
#================================================ #================================================
# noVNC Default Configurations # noVNC Default Configurations
# These Configurations can be changed through -e # These Configurations can be changed through -e
+16 -3
View File
@@ -1,5 +1,7 @@
import unittest import unittest
from time import sleep
from appium import webdriver from appium import webdriver
@@ -13,13 +15,24 @@ class MSiteChromeAndroidUITests(unittest.TestCase):
'deviceName': 'Android Emulator', 'deviceName': 'Android Emulator',
'appPackage': 'com.android.chrome', 'appPackage': 'com.android.chrome',
'appActivity': 'com.google.android.apps.chrome.Main', 'appActivity': 'com.google.android.apps.chrome.Main',
'browserName': 'chrome', 'browserName': 'chrome'
'ignore-certificate-errors': True
} }
self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps) self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps)
def test_open_url(self): def test_open_url(self):
self.driver.get('http://targeturl.com') self.driver.get('http://google.com')
# Handle Welcome Home
self.driver.switch_to.context('NATIVE_APP')
self.driver.find_element_by_id('terms_accept').click()
self.driver.find_element_by_id('negative_button').click()
# Search for Github
self.driver.switch_to.context('CHROMIUM')
search = self.driver.find_element_by_name('q')
search.send_keys('butomo1989 docker-android')
search.submit()
sleep(2)
def tearDown(self): def tearDown(self):
self.driver.quit() self.driver.quit()
@@ -1,5 +1,7 @@
import unittest import unittest
from time import sleep
from appium import webdriver from appium import webdriver
@@ -18,7 +20,12 @@ class MSiteDefaultBrowserAndroidUITests(unittest.TestCase):
self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps) self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps)
def test_open_url(self): def test_open_url(self):
self.driver.get('http://targeturl.com') self.driver.get('http://google.com')
search = self.driver.find_element_by_name('q')
search.send_keys('butomo1989 docker-android')
search.submit()
sleep(2)
def tearDown(self): def tearDown(self):
self.driver.quit() self.driver.quit()
+63 -10
View File
@@ -2,7 +2,6 @@
# Bash version should >= 4 to be able to run this script. # Bash version should >= 4 to be able to run this script.
IMAGE="butomo1989/docker-android" IMAGE="butomo1989/docker-android"
LATEST_BUILD_TOOL=25.0.2
if [ -z "$1" ]; then if [ -z "$1" ]; then
read -p "Task (test|build|push|all) : " TASK read -p "Task (test|build|push|all) : " TASK
@@ -93,8 +92,60 @@ get_android_versions
get_processors get_processors
function test() { function test() {
(export ANDROID_HOME=/root && export ANDROID_VERSION=5.0.1 && export API_LEVEL=21 \ # Prepare needed parameter to run tests
&& export PROCESSOR=x86 && export SYS_IMG=x86_64 && export IMG_TYPE=google_apis && nosetests -v) test_android_version=7.1.1
test_api_level=25
test_processor=x86
test_sys_img=x86_64
test_img_type=google_apis
test_browser=chrome
test_image=test_img
test_container=test_con
# Run e2e tests
# E2E tests must be run only for linux OS / x86 image to reduce duration of test execution
if [ "$(uname -s)" == 'Linux' ] && [ "$E2E" = true ]; then
echo "----BUILD TEST IMAGE----"
docker build -t $test_image --build-arg ANDROID_VERSION=$test_android_version \
--build-arg API_LEVEL=$test_api_level --build-arg PROCESSOR=$test_processor --build-arg SYS_IMG=$test_sys_img \
--build-arg IMG_TYPE=$test_img_type --build-arg BROWSER=$test_browser -f docker/Emulator_x86 .
echo "----REMOVE OLD TEST CONTAINER----"
docker kill $test_container && docker rm $test_container
echo "----PREPARE CONTAINER----"
docker run --privileged -d -p 4723:4723 -p 6080:6080 -e APPIUM=True -e DEVICE="Samsung Galaxy S6" --name $test_container $test_image
docker cp example/sample_apk $test_container:/root/tmp
attempt=0
while [ ${attempt} -le 10 ]; do
attempt=$(($attempt + 1))
output=$(docker ps | grep healthy | grep test_con | wc -l)
if [[ "$output" == 1 ]]; then
echo "Emulator is ready."
break
else
echo "Waiting 10 seconds for emulator to be ready (attempt: $attempt)"
sleep 10
fi
if [[ $attempt == 10 ]]; then
echo "Failed!"
exit 1
fi
done
echo "----RUN E2E TESTS----"
nosetests src/tests/e2e -v
echo "----REMOVE TEST CONTAINER----"
docker kill $test_container && docker rm $test_container
fi
# Run unit tests (After e2e test to get coverage result)
echo "----UNIT TESTS----"
(export ANDROID_HOME=/root && export ANDROID_VERSION=$test_android_version && export API_LEVEL=$test_api_level \
&& export PROCESSOR=$test_processor && export SYS_IMG=$test_sys_img && export IMG_TYPE=$test_img_type \
&& nosetests src/tests/unit -v)
} }
function build() { function build() {
@@ -111,9 +162,13 @@ function build() {
for v in "${versions[@]}"; do for v in "${versions[@]}"; do
# Find image type and default web browser # Find image type and default web browser
if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ] || [ "$v" == "6.0" ]; then if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ]; then
IMG_TYPE=android IMG_TYPE=android
BROWSER=browser BROWSER=browser
elif [ "$v" == "6.0" ]; then
# It is because there is no ARM EABI v7a System Image for 6.0
IMG_TYPE=google_apis
BROWSER=browser
else else
IMG_TYPE=google_apis IMG_TYPE=google_apis
BROWSER=chrome BROWSER=chrome
@@ -127,12 +182,10 @@ function build() {
image_latest="$IMAGE-$p-$v:latest" image_latest="$IMAGE-$p-$v:latest"
echo "[BUILD] Image name: $image_version and $image_latest" echo "[BUILD] Image name: $image_version and $image_latest"
echo "[BUILD] Dockerfile: $FILE_NAME" echo "[BUILD] Dockerfile: $FILE_NAME"
docker build -t $image_version --build-arg ANDROID_VERSION=$v --build-arg BUILD_TOOL=$LATEST_BUILD_TOOL \ docker build -t $image_version --build-arg ANDROID_VERSION=$v --build-arg API_LEVEL=$level \
--build-arg API_LEVEL=$level --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img \ --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img --build-arg IMG_TYPE=$IMG_TYPE \
--build-arg IMG_TYPE=$IMG_TYPE --build-arg BROWSER=$BROWSER -f $FILE_NAME . --build-arg BROWSER=$BROWSER -f $FILE_NAME .
docker build -t $image_latest --build-arg ANDROID_VERSION=$v --build-arg BUILD_TOOL=$LATEST_BUILD_TOOL \ docker tag $image_version $image_latest
--build-arg API_LEVEL=$level --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img \
--build-arg IMG_TYPE=$IMG_TYPE --build-arg BROWSER=$BROWSER -f $FILE_NAME .
done done
done done
} }
+2
View File
@@ -1,3 +1,5 @@
selenium==3.3.1
Appium-Python-Client==0.24
coverage==4.2 coverage==4.2
mock==2.0.0 mock==2.0.0
nose==1.3.7 nose==1.3.7
+1
View File
@@ -2,5 +2,6 @@ import os
ROOT = '/root' ROOT = '/root'
WORKDIR = os.path.dirname(__file__) WORKDIR = os.path.dirname(__file__)
CHROME_DRIVER = os.path.join(ROOT, 'chromedriver')
CONFIG_FILE = os.path.join(WORKDIR, 'nodeconfig.json') CONFIG_FILE = os.path.join(WORKDIR, 'nodeconfig.json')
LOGGING_FILE = os.path.join(WORKDIR, 'logging.conf') LOGGING_FILE = os.path.join(WORKDIR, 'logging.conf')
+8 -4
View File
@@ -5,7 +5,7 @@ import logging
import os import os
import subprocess import subprocess
from src import CONFIG_FILE, ROOT from src import CONFIG_FILE, ROOT, CHROME_DRIVER
from src import log from src import log
log.init() log.init()
@@ -100,14 +100,17 @@ def appium_run(avd_name: str):
:param avd_name: Name of android virtual device / emulator :param avd_name: Name of android virtual device / emulator
""" """
cmd = 'appium' cmd = 'appium'
local_ip = os.popen('ifconfig eth0 | grep \'inet addr:\' | cut -d: -f2 | awk \'{ print $1}\'').read().strip()
default_web_browser = os.getenv('BROWSER')
if default_web_browser == 'chrome':
cmd += ' --chromedriver-executable {driver}'.format(driver=CHROME_DRIVER)
grid_connect = convert_str_to_bool(str(os.getenv('CONNECT_TO_GRID', False))) grid_connect = convert_str_to_bool(str(os.getenv('CONNECT_TO_GRID', False)))
logger.info('Connect to selenium grid? {connect}'.format(connect=grid_connect)) logger.info('Connect to selenium grid? {connect}'.format(connect=grid_connect))
if grid_connect: if grid_connect:
local_ip = os.popen('ifconfig eth0 | grep \'inet addr:\' | cut -d: -f2 | awk \'{ print $1}\'').read().strip()
try: try:
mobile_web_test = convert_str_to_bool(str(os.getenv('MOBILE_WEB_TEST', False))) mobile_web_test = convert_str_to_bool(str(os.getenv('MOBILE_WEB_TEST', False)))
default_web_browser = os.getenv('BROWSER')
appium_host = os.getenv('APPIUM_HOST', local_ip) appium_host = os.getenv('APPIUM_HOST', local_ip)
appium_port = int(os.getenv('APPIUM_PORT', 4723)) appium_port = int(os.getenv('APPIUM_PORT', 4723))
selenium_host = os.getenv('SELENIUM_HOST', '172.17.0.1') selenium_host = os.getenv('SELENIUM_HOST', '172.17.0.1')
@@ -121,7 +124,8 @@ def appium_run(avd_name: str):
subprocess.check_call('xterm -T "{title}" -n "{title}" -e \"{cmd}\"'.format(title=title, cmd=cmd), shell=True) subprocess.check_call('xterm -T "{title}" -n "{title}" -e \"{cmd}\"'.format(title=title, cmd=cmd), shell=True)
def create_node_config(avd_name: str, browser_name: str, appium_host: str, appium_port: int, selenium_host: str, selenium_port: int): def create_node_config(avd_name: str, browser_name: str, appium_host: str, appium_port: int, selenium_host: str,
selenium_port: int):
""" """
Create custom node config file in json format to be able to connect with selenium server. Create custom node config file in json format to be able to connect with selenium server.
-54
View File
@@ -1,54 +0,0 @@
"""Unit test to test app."""
import os
from unittest import TestCase
import mock
from src import app
class TestApp(TestCase):
"""Unit test class to test other methods in the app."""
def test_valid_env(self):
key = 'ENV_1'
os.environ[key] = 'test'
app.get_or_raise(key)
del os.environ[key]
def test_invalid_env(self):
with self.assertRaises(RuntimeError):
app.get_or_raise('ENV_2')
def test_valid_bool(self):
self.assertEqual(app.convert_str_to_bool('True'), True)
self.assertEqual(app.convert_str_to_bool('t'), True)
self.assertEqual(app.convert_str_to_bool('1'), True)
self.assertEqual(app.convert_str_to_bool('YES'), True)
def test_invalid_bool(self):
self.assertEqual(app.convert_str_to_bool(''), False)
self.assertEqual(app.convert_str_to_bool('test'), False)
def test_invalid_format(self):
self.assertEqual(app.convert_str_to_bool(True), None)
@mock.patch('src.app.prepare_avd')
@mock.patch('subprocess.Popen')
def test_run_with_appium(self, mocked_avd, mocked_subprocess):
with mock.patch('src.app.appium_run') as mocked_appium:
os.environ['APPIUM'] = str(True)
app.run()
self.assertTrue(mocked_avd.called)
self.assertTrue(mocked_subprocess.called)
self.assertTrue(mocked_appium.called)
@mock.patch('src.app.prepare_avd')
@mock.patch('subprocess.Popen')
def test_run_withhout_appium(self, mocked_avd, mocked_subprocess):
with mock.patch('src.app.appium_run') as mocked_appium:
os.environ['APPIUM'] = str(False)
app.run()
self.assertTrue(mocked_avd.called)
self.assertTrue(mocked_subprocess.called)
self.assertFalse(mocked_appium.called)
View File
+29
View File
@@ -0,0 +1,29 @@
"""e2e test to test sample android application inside docker-android"""
from unittest import TestCase
from appium import webdriver
class TestE2EAndroidApk(TestCase):
def setUp(self):
desired_caps = {
'platformName': 'Android',
'deviceName': 'Android Emulator',
'automationName': 'UIAutomator2',
'app': '/root/tmp/sample_apk_debug.apk'
}
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
def test_calculation(self):
text_fields = self.driver.find_elements_by_class_name('android.widget.EditText')
text_fields[0].send_keys(4)
text_fields[1].send_keys(6)
btn_calculate = self.driver.find_element_by_class_name('android.widget.Button')
btn_calculate.click()
self.assertEqual('10', text_fields[2].text)
def tearDown(self):
self.driver.quit()
+34
View File
@@ -0,0 +1,34 @@
"""e2e test to test chrome application inside docker-android"""
from unittest import TestCase
from appium import webdriver
class TestE2EChrome(TestCase):
def setUp(self):
desired_caps = {
'platformName': 'Android',
'deviceName': 'Android Emulator',
'appPackage': 'com.android.chrome',
'appActivity': 'com.google.android.apps.chrome.Main',
'browserName': 'chrome'
}
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
def test_open_url(self):
self.driver.get('http://google.com')
# Handle Welcome Home
self.driver.switch_to.context('NATIVE_APP')
self.driver.find_element_by_id('terms_accept').click()
self.driver.find_element_by_id('negative_button').click()
# Search for Github
self.driver.switch_to.context('CHROMIUM')
search = self.driver.find_element_by_name('q')
search.send_keys('butomo1989 docker-android')
search.submit()
def tearDown(self):
self.driver.quit()
View File
+54
View File
@@ -0,0 +1,54 @@
"""Unit test to test app."""
import os
from unittest import TestCase
import mock
from src import app
class TestApp(TestCase):
"""Unit test class to test other methods in the app."""
def test_valid_env(self):
key = 'ENV_1'
os.environ[key] = 'test'
app.get_or_raise(key)
del os.environ[key]
def test_invalid_env(self):
with self.assertRaises(RuntimeError):
app.get_or_raise('ENV_2')
def test_valid_bool(self):
self.assertEqual(app.convert_str_to_bool('True'), True)
self.assertEqual(app.convert_str_to_bool('t'), True)
self.assertEqual(app.convert_str_to_bool('1'), True)
self.assertEqual(app.convert_str_to_bool('YES'), True)
def test_invalid_bool(self):
self.assertEqual(app.convert_str_to_bool(''), False)
self.assertEqual(app.convert_str_to_bool('test'), False)
def test_invalid_format(self):
self.assertEqual(app.convert_str_to_bool(True), None)
@mock.patch('src.app.prepare_avd')
@mock.patch('subprocess.Popen')
def test_run_with_appium(self, mocked_avd, mocked_subprocess):
with mock.patch('src.app.appium_run') as mocked_appium:
os.environ['APPIUM'] = str(True)
app.run()
self.assertTrue(mocked_avd.called)
self.assertTrue(mocked_subprocess.called)
self.assertTrue(mocked_appium.called)
@mock.patch('src.app.prepare_avd')
@mock.patch('subprocess.Popen')
def test_run_withhout_appium(self, mocked_avd, mocked_subprocess):
with mock.patch('src.app.appium_run') as mocked_appium:
os.environ['APPIUM'] = str(False)
app.run()
self.assertTrue(mocked_avd.called)
self.assertTrue(mocked_subprocess.called)
self.assertFalse(mocked_appium.called)
@@ -14,6 +14,14 @@ class TestAppium(TestCase):
os.environ['CONNECT_TO_GRID'] = str(True) os.environ['CONNECT_TO_GRID'] = str(True)
self.avd_name = 'test_avd' self.avd_name = 'test_avd'
@mock.patch('subprocess.check_call')
def test_chrome_driver(self, mocked_subprocess):
os.environ['CONNECT_TO_GRID'] = str(False)
os.environ['BROWSER'] = 'chrome'
self.assertFalse(mocked_subprocess.called)
app.appium_run(self.avd_name)
self.assertTrue(mocked_subprocess.called)
@mock.patch('subprocess.check_call') @mock.patch('subprocess.check_call')
def test_without_selenium_grid(self, mocked_subprocess): def test_without_selenium_grid(self, mocked_subprocess):
os.environ['CONNECT_TO_GRID'] = str(False) os.environ['CONNECT_TO_GRID'] = str(False)
@@ -21,23 +29,29 @@ class TestAppium(TestCase):
app.appium_run(self.avd_name) app.appium_run(self.avd_name)
self.assertTrue(mocked_subprocess.called) self.assertTrue(mocked_subprocess.called)
@mock.patch('os.popen')
@mock.patch('subprocess.check_call') @mock.patch('subprocess.check_call')
def test_with_selenium_grid(self, mocked_subprocess): def test_with_selenium_grid(self, mocked_os, mocked_subprocess):
with mock.patch('src.app.create_node_config') as mocked_config: with mock.patch('src.app.create_node_config') as mocked_config:
self.assertFalse(mocked_config.called) self.assertFalse(mocked_config.called)
self.assertFalse(mocked_os.called)
self.assertFalse(mocked_subprocess.called) self.assertFalse(mocked_subprocess.called)
app.appium_run(self.avd_name) app.appium_run(self.avd_name)
self.assertTrue(mocked_config.called) self.assertTrue(mocked_config.called)
self.assertTrue(mocked_os.called)
self.assertTrue(mocked_subprocess.called) self.assertTrue(mocked_subprocess.called)
@mock.patch('os.popen')
@mock.patch('subprocess.check_call') @mock.patch('subprocess.check_call')
def test_invalid_integer(self, mocked_subprocess): def test_invalid_integer(self, mocked_os, mocked_subprocess):
os.environ['APPIUM_PORT'] = 'test' os.environ['APPIUM_PORT'] = 'test'
with mock.patch('src.app.create_node_config') as mocked_config: with mock.patch('src.app.create_node_config') as mocked_config:
self.assertFalse(mocked_config.called) self.assertFalse(mocked_config.called)
self.assertFalse(mocked_os.called)
self.assertFalse(mocked_subprocess.called) self.assertFalse(mocked_subprocess.called)
app.appium_run(self.avd_name) app.appium_run(self.avd_name)
self.assertFalse(mocked_config.called) self.assertFalse(mocked_config.called)
self.assertTrue(mocked_os.called)
self.assertTrue(mocked_subprocess.called) self.assertTrue(mocked_subprocess.called)
self.assertRaises(ValueError) self.assertRaises(ValueError)
@@ -52,3 +66,5 @@ class TestAppium(TestCase):
del os.environ['CONNECT_TO_GRID'] del os.environ['CONNECT_TO_GRID']
if os.getenv('APPIUM_PORT'): if os.getenv('APPIUM_PORT'):
del os.environ['APPIUM_PORT'] del os.environ['APPIUM_PORT']
if os.getenv('BROWSER'):
del os.environ['BROWSER']