美文网首页安卓开发
Jenkins持续集成体系建设

Jenkins持续集成体系建设

作者: InsaneLoafer | 来源:发表于2021-07-01 08:11 被阅读0次

    目录

    • 任务目标
    • 安卓App构建、打包、部署与自动化测试
    • 安卓App持续集成体系建设实战

    一、任务目标

    • 实战任务的故事
    • 从源码制作出可运行App,支持测试工作
    • 各种自动任务
      • Daily Build打包
      • Daily Build发布
      • Daily Build UI自动测试(BVT - Build Verification Test)
    • 利用技术来帮助做 “杂活儿”
    • 优势:
      • 重复性定式劳动任务,
      • 减少人力参与,提升工作效率
      • Build不再是阻碍测试进度的因素
      • 自动化重用率高,维护频率低

    二、 安卓App构建、打包、部署与自动化测试

    涉及技术点

    • Android App构建
    • Android SDK使用
    • 安卓模拟器或真机
    • Python + Appium自动化测试
    • Jenkins持续集成
    • Shell脚本开发
    • Java程序开发
    • Git ( github使用)

    测试App构建、打包过程

    • Android应用(例子程序)
    • 源码位置:https://github.com/princeqjzh/AndroidSampleApp
    • 安卓打包的目标文件:app-debug.apk文件
    • 安卓打包命令:gradlew clean assembleDebug
    • 安卓安装包的输出路径:/app/build/outputs/apk/debug/app-debug.apk
    • 关于安卓打包的环境要求
      • 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
    • 开发工具:PyCharm
    • UI自动化框架:Appium
    • 测试执行框架:pytest
    • 实现验证点:
      • App可安装
      • App可启动
      • App首页预期的元素存在
    • 校验步骤
      • 启动App
      • 检查Record Event是否存在
      • 结束输出结果


        image.png

    测试源码

    • 目录树


      image.png
    • Readme.me

    **iApp BVT自动化测试程序(Python版)**
    运行环境:
    - 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持续集成体系建设实战演练

    • 将之前内容所做事情用Jenkins任务来实现
    • Jenkins平台源码构建、打包、发布app测试包
    • Jenkins自动部署、测试新app测试包
    • Jenkins通知运行结果

    实现流程图

    image.png

    安卓打包任务

    image.png

    安卓APP发布 输出apk文件

    image.png

    安卓app自动部署、测试任务

    image.png

    App打包任务与自动部署、测试任务关联

    • 实现完成打包任务之后,运行自动测试任务,安装新包,并运行UI自动测试验证新安装包的正确性


      image.png

    配置任务结果邮件通知

    • 任务完成之后要把结果周知到相关人员,可以通过email的方式进行通知
    image.png
    • 结果通知:任务正确完成


      image.png

    三、安卓App持续集成体系建设实战

    创建打包任务

    1. 创建job


      image.png
    2. 选择任务运行的节点-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. 添加发布路径:AndroidSampleApp/app/build/outputs/apk/debug/app-debug.apk

      image.png
    2. 进行构建,查看控制台输出以及运行结果


      image.png
      image.png

    创建自动化测试任务

    1. 创建任务


      image.png
    2. 选择打包的机器


      image.png
    3. 添加项目的GitHub地址,复制项目名称


      image.png
    4. 粘贴项目名称到sub-directory


      image.png
    5. 输入shell命令

    • 如果apk 不存在执行uninstall 命令会报错,可以用以下命令过渡,中间的| |是或者的意思,先之前前面的命令,如果前面的命令报错则执行后面的命令
    {
        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. 构建job,进行运行


      image.png

    配置消息通知

    • 打包job和自动化测试job添加 Email Notification


      image.png

    关联任务

    • 在打包job中添加关联,Post-bulid Actions -> Build other projects


      image.png

    构建打包任务会自动触发自动化测试脚本

    image.png
    image.png

    四、课程总结

    • 从源码到可测包,外加自动化测试验证的全流程持续集成体系建设
    • 安卓App的构建、打包方法
    • Apk文件发布
    • 触发自动测试
    • Appium UI自动化测试
    • 利用Jenkins平台进行持续集成演练

    五、FAQ

    如何做失败后的自动重试

    • 在job的 Post-build Actions 中添加 Retry build after failure 插件
      • Fixed -> Fixed delay:表示延迟多少秒再次构建
      • Maximum number of successive failed builds:重试次数
      • 可以捕捉错误信息,使用正则表达式,| 表示或
    image.png

    相关文章

      网友评论

        本文标题:Jenkins持续集成体系建设

        本文链接:https://www.haomeiwen.com/subject/bkvwyltx.html