后台UI自动化测试,即通过自动化的方式控制机器模拟器进行人工操作。随着GrowingIO业务的不断发展和新需求的不断增加,回归测试的任务也越来越重。现有的测试资源已经不足以应对繁重的回归测试任务。迫切需要UI自动化来代替手动回归测试。腾出回归测试的人力去做更精准的测试。因此,下面引出了GrowingIO中WebUI自动化的构建。本文主要介绍以下两个方面:1.框架搭建2.集成质量平台框架搭建PageObject众所周知,UI自动化测试位于测试金字塔的顶端。投资回报率低。其痛点主要体现在:1、测试用例维护成本高,页面元素的定位方式或布局有一些小改动,之前写的代码可能会有很大的改动;2.代码冗余,复用性低,可读性不好。针对以上痛点,经过大量调研,我们决定采用PageObject设计模式。核心思想是六个原则:公共方法代表页面提供的服务,不暴露页面细节,不混用断言和操作细节,方法可以返回一个新的页面,不把整个页面内容放在PageObject中,相同的行为会产生不同的结果,可以封装不同的结果基于以上六大原则,结合GrowingIO的具体业务情况,目录层次设计如下:BasePage层:封装了一些对网页的基本操作方法,例如打开浏览器,查找元素,截图等。Component层:继承BasePage层,封装了页面中公共组件的操作方法,如时间组件Page层:继承Component层,这里面的各个方法layer对应当前页面的一个函数,方法可以调用Component层中的方法或者调用封装在BasePage层T中的方法estCase层:调用封装在业务Page层的方法,编写业务案例,进行断言实际项目的目录层次如下:├──basepage│└──base_page.py├──component│└──element_design.py├──conf│├──conf.py├──datas├──日志│└──all.log├──log.py├──page│├──home_page.py│├──login_page.py│├──main_page.py│├──pytest.ini├──report│├──requirements.txt├──run_all_cases.py├──testcase│├──conftest.py│├──testcase.py│└──util└──util.pySelenium+Python语言选择Python,对新人友好,熟悉团队,可以快速上手;目前市场上的WebUI自动化测试方案百花齐放,按底层技术一般分为以下几类:1.WebDriver协议:如Selenium3、WebdriverIO、Protractor、Nightwatchjs2。代理JS注入:如SeleniumRC,TestCafe,Cypress3.DevTool协议类:如Puppeteer,Playwrightt我们选择使用Selenium3,优点如下:开源,免费多浏览器支持:Firefox,Chrome,IE,Opera,Edge多平台支持:Linux、Windows、Mac多语言支持:Java、Python、Ruby、C#、JavaScript、C++对网页都有很好的支持others),灵活(使用开发语言驱动),足够稳定,最重要的是Selenium的Grid方案是一个非常成熟的分布式方案,所谓分布式就是由一个Hub节点和若干个Node代理节点组成。Hub用于管理各个代理节点的注册信息和状态信息,并接受远程客户端代码的请求调用,然后将请求的命令转发给代理节点执行,最后汇总各个代理节点的执行结果并将其返回给远程客户端。无论是与Jenkins的集成,还是对用例执行时间的要求,分布式执行才是UI自动化的最终状态。这里使用docker-compose创建Hub和Node节点。docker-compose.yml文件内容如下:version:'3'services:hub:container_name:selenium-hubimage:selenium/hubrestart:alwaysports:-4445:4444environment:HUB_HOST:hubhealth-timeout:30SE_NODE_SESSION_TIMEOUT:30000JAVA_nodeOPTS:-Xmx1024mchrome-chrome-serlenium/image:调试:3.141.59-20210311container_name:chrome_test重启:始终依赖于:-集线器端口:-4446:5900卷:-/etc/hosts:/etc/hosts-/dev/shm:/dev/shm环境:JAVA_OPTS:-Xmx512mHUB_HOST:hubNODE_MAX_SESSION:5NODE_MAX_INSTANCES:5firefox:image:selenium/node-firefox-debug:3.141.59-20210311container_name:firefox_testrestart:always端口:-4447:5900卷/主机:-/etc/hosts:-/etc/hosts-/dev/shm:/dev/shmdepends_on:-hub环境:-JAVA_OPTS=-Xmx512m-HUB_HOST=hub-NODE_MAX_SESSION=4-NODE_MAX_INSTANCES=4Grid模式执行流程图文档和对参数化的支持,你可以细粒度地控制要测试的测试用例。第三方插件很多,可以自定义扩展,比如allure-pytest(完美测试报告)、pytest-rerunfailures(失败案例重复执行)、pytest-xdist(多CPU分发)等都可以与詹金斯很好地结合。说到Pytest,不得不提一下它的本质:Fixture,Fixture比传统的测试框架(Setup/Teardown)更灵活:它有独立的命名,通过声明它们来激活测试函数、模块、类的使用或整个项目并以模块化方式实施。每个Fixture可以互相调用。Fixture的范围是灵活且可配置的。scope参数可以用来指定Fixture的作用范围:函数(Function)、模块(Module)、类(Class),或者整个项目(Session),执行顺序为:Session>Module>Class>FunctionIn本项目中,大量使用@pytest.fixtrue装饰器来装饰方法,将装饰后的方法名作为参数传入测试方法。该方法可用于完成测试前的初始化,或将数据库返回给测试函数,尤其是与conftest文件和yield一起使用时。conftest.pyimportpytestfromseleniumimportwebdriverfromselenium.webdriverimportDesiredCapabilities@pytest.fixture(scope='session')definit_driver():如果浏览器=="chrome":driver=webdriver.Chrome()elifbrowser=='firefox':driver=webdriver.Firefox()elifbrowser=='safari':driver=webdriver.Safari()elifbrowser=='remote':capabilities=DesiredCapabilities.CHROMEdriver=webdriver.Remote(command_executor='http://localhost:4445/wd/hub',desired_capabilities=capabilities)else:driver=''print('暂不支持浏览器类型!!')driver_obj=OpBasePage(driver)yieldinit_driver.open_op_url().login_op_by_gui(username,password)#关闭浏览器driver_obj.close_browser()test_dashboard.pyclassTestDataBoard:@pytest.fixture()defboard(self,init_driver):yieldinit_driver.jump_to_board_by_url()deftest_board_sort(self,board):board.click_button_go_to_board_manage_board().check可以从上面两个文件可以看出,传入的是conftest.py文件中的方法名init_driver,而test_dashboard.py文件中的board方法中,board方法被@pytest.fixtrue装饰器修饰后,test_board_sort测试是在方法中传递的,所以在运行测试方法test_board_sort,程序执行顺序为AllureAllure是一个轻量级且非常灵活的开源测试报告框架支持绝大部分测试框架,如TestNG、Pytest、JUint等,使用简单,易于与Jenkins集成,跨多个测试用例展示趋势。Allure装饰器:导入allureimportpytest@allure.feature("distribute-analysis")classTestDistributionAnalysis:@pytest.fixture()defdistribution_analysis(self,init_driver):yieldinit_driver.jump_to_distribution_analysis_by_url()@allure.story("检查分发分析")deftest_analysis_success(self,distribution_analysis):withallure.step("createchart"):distribution_name,save_toast,distribution_detail_analysis=distribution_analysis.click_button_to_create_distribute_analysis().create_distribution_analysis()distribution_list_name,distribution_analysis=distribute_detail_analysis.click_crumb_to_distribution_analysis().get_first_distribution_chart_name()assertdistribution_name==distribution_list_name,'新的分布分析单图未显示在列表页'withallure.step("deletechart"):distribute_analysis.delete_first_distribution_chart()测试报告示例嵌入使用失败截图这里的案例,WebUI自动化框架(PageObject+Selenium+Pytest+Allure),框架整体执行流程如下:综合质量平台自动化框架搭建完成,但这只是第一步。质量平台与飞书、Jira集成对接,形成完整可追溯的流程闭环。具体流程如下:1.在质量平台页面,选择测试环境地址和项目ID,然后点击【开始WebUI测试】按钮,在选择的测试环境和项目下执行自动化用例。2.自动化用例执行完成后,发送飞书通知,自动爬取每个失败用例的数据并展示在质量平台上。3.测试人员检查,剔除非Bug用例,检查剩余数据,点击【提交BUG】按钮,在Jira上自动批量创建子Bug,分配给相应的开发人员。4、开发人员修改完成后,重复1~3步,直到所有测试用例通过流程图汇总后集成质量平台落地后,二是自动化发现的问题要及时跟踪验证,使整个过程形成一个完整的闭环。当然,上面提到的构建WebUI自动化和整合优质平台的整个过程,肯定还有很多需要打磨的地方。地方,希望大家多多指教。
