Jenkins持續(xù)集成體系建設

目錄

  • 任務目標
  • 安卓App構(gòu)建、打包、部署與自動化測試
  • 安卓App持續(xù)集成體系建設實戰(zhàn)

一、任務目標

  • 實戰(zhàn)任務的故事
  • 從源碼制作出可運行App,支持測試工作
  • 各種自動任務
    • Daily Build打包
    • Daily Build發(fā)布
    • Daily Build UI自動測試(BVT - Build Verification Test)
  • 利用技術(shù)來幫助做 “雜活兒”
  • 優(yōu)勢:
    • 重復性定式勞動任務,
    • 減少人力參與,提升工作效率
    • Build不再是阻礙測試進度的因素
    • 自動化重用率高,維護頻率低

二、 安卓App構(gòu)建、打包、部署與自動化測試

涉及技術(shù)點

  • Android App構(gòu)建
  • Android SDK使用
  • 安卓模擬器或真機
  • Python + Appium自動化測試
  • Jenkins持續(xù)集成
  • Shell腳本開發(fā)
  • Java程序開發(fā)
  • Git ( github使用)

測試App構(gòu)建、打包過程

  • Android應用(例子程序)
  • 源碼位置:https://github.com/princeqjzh/AndroidSampleApp
  • 安卓打包的目標文件:app-debug.apk文件
  • 安卓打包命令:gradlew clean assembleDebug
  • 安卓安裝包的輸出路徑:/app/build/outputs/apk/debug/app-debug.apk
  • 關(guān)于安卓打包的環(huán)境要求
    • JDK 1.8
    • Android SDK
    • Gradle


      image.png

      image.png
安卓App部署
  • 前提條件:

    • 安卓實體機或者安卓模擬器
    • 安卓SDK
  • 目標:通過命令安裝/卸載App

  • 命令控制apk安裝與卸載

    • 安裝:adb install <file_ path>
    • 卸載:adb uninstall <package_ name>
  • 查找包名:adb shell pm list packages | grep sample

    image.png

安卓UI自動化測試

  • Appium app自動測試
  • 源碼位置:https://github.com/princeqjzh/iAppBVT_Python
  • 開發(fā)工具:PyCharm
  • UI自動化框架:Appium
  • 測試執(zhí)行框架:pytest
  • 實現(xiàn)驗證點:
    • App可安裝
    • App可啟動
    • App首頁預期的元素存在
  • 校驗步驟
    • 啟動App
    • 檢查Record Event是否存在
    • 結(jié)束輸出結(jié)果


      image.png

測試源碼

  • 目錄樹


    image.png
  • Readme.me

**iApp BVT自動化測試程序(Python版)**
運行環(huán)境:
- appium server
- python3
- unittest, pytest
- git

配置文件:iAppBVT_Python.json
- 將配置文件復制到本地磁盤
- 填入設備的 deviceName 與 udid

運行命令:
pytest -sv test/bvt_test.py --tc-file /full path/iAppBVT_Python.json --tc-format json
  • bvt_test.py 文件
from appium import webdriver
import unittest
import time
from pytest_testconfig import config

timeout = 30 # 超時
poll = 2 # 輪詢


class IAppBVT(unittest.TestCase):

    def setUp(self):
        desired_caps = {}
        appium_server_url = config['appium_server_url']
        desired_caps['platformName'] = config['desired_caps']['platformName']
        desired_caps['udid'] = config['desired_caps']['udid']
        desired_caps['deviceName'] = config['desired_caps']['deviceName']
        desired_caps['appPackage'] = config['desired_caps']['appPackage']
        desired_caps['appActivity'] = config['desired_caps']['appActivity']
        desired_caps['automationName'] = config['desired_caps']['automationName']
        desired_caps['noReset'] = config['desired_caps']['noReset']

        self.driver = webdriver.Remote(appium_server_url, desired_caps)

    def tearDown(self):
        self.driver.quit()

    def test_bvt(self):
        print('BVT test is started!')
        status = self.is_record_event_btn_exist()
        print(f'The record event button is exist - {status}')
        self.assertTrue(status, f'Check record_button result is {status}')
        print('Test finished!')

    def is_record_event_btn_exist(self):
        elem = self._find_elem_by_xpath('//android.widget.Button[contains(@resource-id,"id/trackEventButton")]')
        return elem is not None

    def _find_elem_by_xpath(self, elem_xpath, time_out=timeout, raise_exception=True):
        start = time.time()
        elem = None
        while time.time() - start < time_out and elem is None:
            time.sleep(poll)
            try:
                elem = self.driver.find_element_by_xpath(elem_xpath)
            except Exception:
                print('by pass the element not found')

        if elem is None and raise_exception:
            raise LookupError(f'The element which xpath is {elem_xpath} could not be found')

        return elem
  • iAppBVT_Pyhon.json 文件
  • 獲取udid:adb devices
    image.png
{
    "desired_caps": {
        "platformName": "Android",
        "deviceName": "<your device name>",
        "udid": "<your device udid>",
        "noReset": "false",
        "automationName": "UiAutomator2",
        "appPackage": "com.appsflyer.androidsampleapp",
        "appActivity": ".MainActivity"
    },
    "appium_server_url": "http://localhost:4723/wd/hub"
}
  • requirements.txt
allure-pytest
appium-python-client
pytest
pytest-testconfig
requests
selenium
urllib3

三、安卓App持續(xù)集成體系建設實戰(zhàn)演練

  • 將之前內(nèi)容所做事情用Jenkins任務來實現(xiàn)
  • Jenkins平臺源碼構(gòu)建、打包、發(fā)布app測試包
  • Jenkins自動部署、測試新app測試包
  • Jenkins通知運行結(jié)果

實現(xiàn)流程圖

image.png

安卓打包任務

image.png

安卓APP發(fā)布 輸出apk文件

image.png

安卓app自動部署、測試任務

image.png

App打包任務與自動部署、測試任務關(guān)聯(lián)

  • 實現(xiàn)完成打包任務之后,運行自動測試任務,安裝新包,并運行UI自動測試驗證新安裝包的正確性


    image.png

配置任務結(jié)果郵件通知

  • 任務完成之后要把結(jié)果周知到相關(guān)人員,可以通過email的方式進行通知
image.png
  • 結(jié)果通知:任務正確完成


    image.png

三、安卓App持續(xù)集成體系建設實戰(zhàn)

創(chuàng)建打包任務

  1. 創(chuàng)建job


    image.png
  2. 選擇任務運行的節(jié)點-master


    image.png
  3. 添加項目的GitHub地址,并復制項目名稱


    image.png
  4. 將復制的項目名稱復制到sub-directory


    image.png
  5. 添加shell命令

. ~/.bash_profile
cd AndroidSampleApp
sh gradlew clean assembleDebug
image.png
  1. 添加發(fā)布路徑:AndroidSampleApp/app/build/outputs/apk/debug/app-debug.apk

    image.png

  2. 進行構(gòu)建,查看控制臺輸出以及運行結(jié)果


    image.png

    image.png

創(chuàng)建自動化測試任務

  1. 創(chuàng)建任務


    image.png
  2. 選擇打包的機器


    image.png
  3. 添加項目的GitHub地址,復制項目名稱


    image.png
  4. 粘貼項目名稱到sub-directory


    image.png
  5. 輸入shell命令

  • 如果apk 不存在執(zhí)行uninstall 命令會報錯,可以用以下命令過渡,中間的| |是或者的意思,先之前前面的命令,如果前面的命令報錯則執(zhí)行后面的命令
{
    adb uninstall com.appsflyer.androidsampleapp
} | | {
    echo 'no app package installed on the device'
}
  • pwd命令是為了獲取當前路徑
. ~/.bash_profilepwd= `pwd`
apk=$pwd/../1219_buildAndroidsample/AndroidSampleApp/app/build/outputs/apk/debug/app-debug.apk
{
    adb uninstall com.appsflyer.androidsampleapp
}||{
    echo 'no app package installed on the device'
}
adb install $apk
cd iAppBVT_Python
pip3.9 install -r requirements.txt
pytest -sv test/bvt_test.py --tc-file /Users/jizhiqian/iAppBvT_Python.json --tc-format json
image.png
  1. 構(gòu)建job,進行運行


    image.png

配置消息通知

  • 打包job和自動化測試job添加 Email Notification


    image.png

關(guān)聯(lián)任務

  • 在打包job中添加關(guān)聯(lián),Post-bulid Actions -> Build other projects


    image.png

構(gòu)建打包任務會自動觸發(fā)自動化測試腳本

image.png

image.png

四、課程總結(jié)

  • 從源碼到可測包,外加自動化測試驗證的全流程持續(xù)集成體系建設
  • 安卓App的構(gòu)建、打包方法
  • Apk文件發(fā)布
  • 觸發(fā)自動測試
  • Appium UI自動化測試
  • 利用Jenkins平臺進行持續(xù)集成演練

五、FAQ

如何做失敗后的自動重試

  • 在job的 Post-build Actions 中添加 Retry build after failure 插件
    • Fixed -> Fixed delay:表示延遲多少秒再次構(gòu)建
    • Maximum number of successive failed builds:重試次數(shù)
    • 可以捕捉錯誤信息,使用正則表達式,| 表示或
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容