在多個docker容器中並行執行app自動化測試


准備工作

升級Python版本

Centos7中自帶的Python版本是2.7.5,app自動化是用Python3寫的,因此需要升級Centos7的Python版本

# 切換工作目錄到/opt
cd /opt

# 下載目標Python版本的壓縮包
wget http://npm.taobao.org/mirrors/python/3.8.0/Python-3.8.0.tgz

# 安裝解壓命令unzip
pip install -y unzip

# 解壓壓縮包
tar -zxvf Python-3.8.0.tgz

# 安裝libffi-devel  tk-devel,否則編譯和pip install過程中會報ModuleNotFoundError: No module named '_ctypes'的錯誤
yum -y install libffi-devel  tk-devel 

# 安裝gcc,否則編譯時會報錯
yum -y install gcc

# 切換到Python-3.8.0目錄
cd Python-3.8.0

# 生配置
# 注意這里要加上--prefix能好點。如果不加,安裝后的可執行文件默認放在/usr/local/bin
# 庫文件默認放在/usr/local/lib,配置文件默認放在/usr/local/etc,其他資源默認放在
# /usr/local/share。比較雜亂。如果加上,會把所有的資源文件都放在指定路徑下,卸載
# 時,只需要刪除該目錄即可
./configure --prefix=/opt/Python-3.8.0

# 編譯安裝
make && make install 

# 創建軟鏈接:創建后輸入python3就可以進入到python3的環境
ln -s /opt/Python-3.8.0/bin/python3 /usr/bin/python3

# 配置環境變量
vim /etc/profile
在PATH后加上::$PATH:/opt/Python-3.8.0/bin
source /etc/profile

pip配置國內源

為了提高pip安裝速度,將pip配置為國內鏡像源

# 在家目錄下創建.pip目錄
cd ~
mkdir .pip

# 切換到pip目錄並創建pip.conf文件
cd .pip
touch pip.conf

#編輯pip.conf,輸入以下內容保存
vim pip.conf
[global]
timeout = 100
index-url =  http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com

# 升級pip
pip3 install --upgrade pip

安裝依賴庫

在本地項目根目錄下的命令行中,使用pip freeze將依賴庫信息信息輸出到requirement.txt文件

pip freeze >requirements.txt

然后將項目壓縮成zip包,通過rz命令上傳到Centos7的/work_shop目錄下,然后解壓

接着進入到項目目錄下,安裝依賴庫

啟動容器

在上次已經啟動了一個4723端口的appium容器,現在再手動啟動一個4725的appium容器,名字命名為appium_2

docker run --privileged -d -p 4725:4725 --name appium_2 appium/appium

模擬器設置

利用夜神多開器啟動另一個安卓5.1.1的模擬器,設置橋接,靜態ip為192.168.0.104

然后設置模擬器的連接方式為tcpip連接

C:\Users\beck
λ adb cdevices
List of devices attached
127.0.0.1:62025 device   #安卓7
127.0.0.1:62001 device   #安卓5

C:\Users\beck
λ adb c-s 127.0.0.1:62001 tcpip 5555
restarting in TCP mode port: 5555

docker連接模擬器

docker exec -it appium_1 adb connect 192.168.0.102:6666
docker exec -it appium_2 adb connect 192.168.0.104:5555

如果能看到這樣的輸出說明已經都連接上了

修改python代碼

修改main.py

main.py里主要是修改device_infos中的信息,比如加入了docker_name,以便BaseDriver初始化時使用它,device_ip是模擬器橋接后得到的靜態ip,device_port是給模擬器設置的tcp端口號

import pytest, os
import time
from common.conf_dir import root_dir, logs_dir, html_reports_dir
from multiprocessing import Pool
from clean import *

device_infos = [{"docker_name": "appium_1", "platform_version": "7.1.2", "device_ip":"192.168.0.102", "device_port": 6666, "server_port": 4723, "system_port": 8200},
                {"docker_name": "appium_2", "platform_version": "5.1.1", "device_ip":"192.168.0.104", "device_port": 5555, "server_port": 4725, "system_port": 8201}]


cur_time = time.strftime("%Y-%m-%d_%H-%M-%S")

def run_parallel(device_info):
    pytest.main([
        f"--cmdopt={device_info}",
        #"--reruns=1",
        #"--reruns-delay=10",
        "-m", "fail",
        "--junitxml", f"{html_reports_dir}/autotest_report_{cur_time}.xml",
        "--html", f"{html_reports_dir}/autotest_report_{cur_time}.html",
        "--css", f"{html_reports_dir}/assets/style.css",
        "--self-contained-html"])



if __name__ == "__main__":
    with Pool(2) as pool:
        pool.map(run_parallel, device_infos)
        pool.close()
        pool.join()

修改base_driver.py

在BaseDriver.py的初始化方法__init__中加入cmd和os.system(cmd),注意不能使用docker logs -f appium_1,因為輸出appium server實時日志時,后面的代碼就一直卡在那里,所以使用docker appium_1這種方式

from appium import webdriver
from .conf_dir import caps_dir
import yaml
import os


class BaseDriver:

    def __init__(self, device_info):
        self.device_info = device_info
        cmd = f"docker {self.device_info['docker_name']}"
        os.system(cmd)



    def base_driver(self, automationName="appium"):
        fs = open(f"{caps_dir}//caps.yml")
        #平台名稱、包名、Activity名稱、超時時間、是否重置、server_ip、
        desired_caps = yaml.load(fs, Loader=yaml.FullLoader)
        #版本信息
        desired_caps["platform_version"] = self.device_info["platform_version"]
        #設備名稱
        desired_caps["deviceName"] = f"{self.device_info['device_ip']}:{self.device_info['device_port']}"
        #系統端口號
        desired_caps["systemPort"] = self.device_info["system_port"]

        if automationName != "appium":
            desired_caps["automationName"] = automationName

        driver = webdriver.Remote(f"http://127.0.0.1:{self.device_info['server_port']}/wd/hub", desired_capabilities=desired_caps)
        return driver

運行

切換到/workshop/APP_AutoTest目錄后,使用python3運行main.py

python3 main.py


測試報告

右下角是我們添加的失敗用例的截圖,這個報告比較簡陋,后面會使用allure優化

源碼下載

git clone https://github.com/cnhkzyy/appium-app-test.git
git checkout version11.0

參考文章

《CentOS7 下升級Python版本》
《在centos上配置Python pip國內鏡像源》
《安裝python3.7出現ModuleNotFoundError: No module named '_ctypes'解決辦法》
《「docker實戰篇」python的docker-創建appium容器以及設置appium容器連接安卓模擬器(31)》
《docker 部署appium》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM