APP下载

面向电力信息系统的分布式自动化测试集成平台

2022-07-26郭永和闫龙川白东霞高德荃何永远杨波李永梅

网络安全技术与应用 2022年7期
关键词:测试用例用例测试数据

◆郭永和 闫龙川 白东霞 高德荃 何永远 杨波 李永梅

面向电力信息系统的分布式自动化测试集成平台

◆郭永和 闫龙川 白东霞 高德荃 何永远 杨波 李永梅

(国家电网公司信息通信分公司 北京 100761)

随着电力企业数字化建设的开展,信息系统的规模日趋庞大,传统的以重复性人工劳动为主的测试方法已无法适应新一代电力信息系统质量评估要求。本文提出了一种面向电力信息系统的分布式自动化测试持续集成平台。该平台基于Jenkins+Selenium+Python框架,能够将信息系统检修前运行测试和日常用户体验测试中重复性强的部分工作从手工化转变为快速自动化,一次编写脚本多次重复使用,基本实现“一键测试”,提高测试效率,并且能降低人为失误,更好提升测试质量。

信息系统;分布式;自动化;软件测试

随着电力企业大力推进企业数字化建设,信息系统规模日益庞大,架构设计与开发日趋复杂,系统内部以及系统之间存在的隐患与风险也随之增加,因此有必要通过开展信息系统测试对系统质量进行评估,尽早发现系统中存在的问题和安全隐患,进一步优化提升系统质量,支撑企业安全生产。

传统测试依靠大量烦琐的人工重复性工作,需要消耗大量人力和时间,测试效率较低,难以满足日益增加的测试任务量。自动化测试技术可以有效提高测试效率、降低测试成本,使得测试工作可以尽可能方便快捷、高效的开展,从而及时、快速发现系统中存在的问题与隐患,促进信息系统进一步优化完善,提升信息系统质量,有效保障企业信息系统稳定可靠运行。因此非常有必要开展信息系统自动化测试工具与技术的研究与应用工作。

本文提出了一种分布式自动化测试持续集成平台(简称自动化测试平台)主要针对信息系统自动化测试工具与技术开展研究与应用。本平台基于Jenkins+Selenium+Python框架,搭建和优化为适合电力企业信息系统的测试平台,依据该平台能够将信息系统检修前运行测试和日常用户体验测试中重复性强的部分工作从手工化转变为快速自动化,一次编写脚本多次重复使用,基本实现“一键测试”,提高测试效率,并且能降低人为失误,更好提升测试质量;该平台不仅能够验证简单操作如页面点击、账户登录等正常与否,还能够验证复杂业务流程是否可以跑通,能够较全面测评信息系统的功能、性能质量,及时发现存在的问题;系统检修前自动化开展运行测试,对系统功能、性能进行回归测试,智能化、自动化开展线上故障诊断,自动返回测试报告结果,包含测试过程截图,使得缺陷问题可溯源分析;确保生产系统稳定运行的情况下,在真实项目中开展日常定时拨测,在一定程度上提高了测试的效率和稳定性,并利用测试结果数据进行统计分析,促进提升系统用户体验度。

1 自动化测试简介

1.1 国内外研究现状

软件自动化测试的发展是一个渐进的过程[1],其发展的过程和特点可以通过图1来展示。

目前国际上通常把自动化测试技术的发展及演变类型大致分为三个阶段(也有人据此将其分为三代)[2]:

第一代,简单的录制和回放模式。此模式使用测试工具记录整个的操作步骤和数据创建为测试脚本,最后通过回放来完成操作过程。这种方式的优点是难度不高,对技术人员的要求低,缺点是会导致测试脚本和测试数据无法分开。并且在测试的过程中,一旦页面元素发生变化就需要重新录制脚本,测试脚本维护成本将会很高。

第二代,数据驱动模式。这种模式将所有测试用例和测试数据分离开来,达到提高代码复用的目的。这种模式提高了代码复用率,可维护性也有了提高,但是界面元素变化对测试脚本仍然有比较大的影响。

第三代,关键词驱动模式。这种模式是对数据驱动模式的一种改进类型。通过关键词驱动模式编写的测试用例不仅在可读性上有较大的提升,更使页面元素变化对测试脚本的影响降到了最低。

国内软件自动化测试理论虽然起步比较晚,但是发展速度很快。市面上诞生了许多自动化测试的解决方案,越来越多的自动化测试工具和框架得到了应用。下面从多个维度对最流行的四种自动化测试框架优缺点进行比较分析[3],以便结合实际情况选择合适的框架。

图1 自动化测试发展历程和特点

表1 自动化测试框架比较

框架类型优点缺点 录制/回放简单、易用,上手快,不需要维护测试数据测试数据与测试脚本耦合性高,重用性低,测试脚本维护成本很高 数据驱动测试过程简单、快捷测试脚本易维护测试数据与测试脚本耦合性中等,脚本产生过程复杂,框架维护困难 关键词驱动框架易维护、易使用重用性高测试数据与测试脚本耦合性低框架实现困难数据维护耗时 混合框架支持库,脚本产生简单,测试脚本和测试数据耦合性低框架实现相对困难脚本映射关系复杂

综上所述,自动化测试框架和新技术的发展是密切相结合的,自动化测试框架是我们编写自动化测试脚本的中心思想,是企业实施自动化测试的一个必然的发展方向,选择具体的测试框架和测试工具并不存在绝对的优劣,对于企业来说,实现自动化测试最关键的是根据项目的测试需求及系统的特点选择正确的自动化测试框架和测试工具,但混合自动化测试框架将以上四种类型的框架融合在一起,互相发挥其作用,这种混合框架将会是今后自动化测试的必然发展趋势。

1.2 软件自动化测试框架简介

软件自动化测试框架[4]:由一个或多个自动化测试基础模块、自动化测试管理模块、自动化测试统计模块等组成的工具集合,这组集合与测试脚本管理、测试用例执行及测试报告输出相关联,包含了一系列基础代码和原则。测试框架是自动化测试发展历程中的重要进步,能有效克服测试过程中的遇到的各类瓶颈。

测试框架为自动化测试提供了基础,并简化了自动化测试流程,测试框架的好坏直接影响自动化测试的成功与否。本文设计的测试平台的测试框架基于Jenkins+Selenium+Pytest工具,使用Python语言进行自动化测试用例的编写,通过Pytest组织执行测试用例,同时引入Jenkins进行持续集成,并设置定时任务定时执行测试用例。然后通过Allure和HTMLTestRunner生成对应自动化测试报告,并通过配置邮件加附件的方式发送给相关人员。该测试平台在明确自动化测试所具有优势的基础上,解决了自动化测试工作中遇到的页面需求频繁变更导致的测试用例修改时间过长、开发迭代速度太快导致的版本经常更新等痛点和难点。

该自动化测试平台能满足WEB、APP功能自动化测试和接口自动化测试的需要。它将各种不同的测试活动有机地连接在一起,对自动化测试用例进行参数化,使用关键词进行封装,通过在Jenkins平台设置各种触发器和构建任务,自动拉取最新代码并执行测试用例,实现WEB自动化测试。在测试执行完成后,自动将Allure或HTMLTestRunner生成的测试报告通过Jenkins将其发送到对应项目人员的邮箱,方便掌握测试用例的执行状态、执行结果。项目人员可以根据测试结果为失败的测试报告的错误点,对代码进行排查。

该自动化测试平台将使流程和应用程序更容易测试,更具可读性,可扩展性,可重用性和可维护性。借助自动化测试平台,将提高团队的测试效率和速度,降低测试维护成本并提高测试准确性,实现无人值守的自动化全方位测试。

2 自动化测试平台设计及实现

2.1 自动化测试平台总体设计

自动化测试平台的设计需要立足企业安全生产,结合企业测试的实际情况。本文设计的平台主要针对WEB系统,实现了包括测试项目分类管理,测试用例管理、生成脚本,测试自动执行,测试结果管理以及发送自动化测试报告等功能,基本可实现“一键测试”。本自动化测试平台包括核心层,工具层,用例层,报告层,分别对应本平台的相应功能模块,具体如下图2所示:使用层次结构设计实现的测试平台,在测试过程中能够支持界面元素与业务逻辑的分离,能简化测试人员编写测试脚本的过程,有效地解决了自动化测试代码变更频繁的问题,降低了维护成本。

图2 自动化测试平台组成

2.2 自动化测试平台逻辑结构

自动化测试平台从逻辑结构上可划分为四个过程[5],这四个过程分别是搭建自动化测试平台,设计测试需求/用例,编写自动化测试脚本,测试执行和生成测试结果,后三个过程贯穿于每个测试用例执行的始终。

·构建自动化测试平台:集成测试框架和各类测试工具,构建符合要求的测试平台。

·设计测试需求/用例:明确测试需求,根据测试需求形成对应的测试用例,测试用例是测试工作的核心。

·编写自动化测试脚本:使用Python语言进行手工编程,将测试用例转变为自动化测试脚本。

·测试执行和生成测试结果:根据配置好的测试环境,自动执行测试,测试完成后和产生测试日志和生成测试报告。

可见,四个过程是环环相扣,紧密关联的,都是保证自动测试流程顺利进行不可缺失的部分。

2.3 自动化测试平台相关组件

2.3.1Selenium工具

Selenium是ThoughtWorks公司的一个强大的开源测试工具集,主要面向于WEB应用程序测试。Selenium测试套件模拟真实用户对浏览器的操作。采用Selenium作为自动化测试工具主要看重其强于其他测试工具的多种优势[6]。它支持多种编程语言(Python、Java,PHP等)、操作系统平台(Windows、Linux等)以及浏览器(Opera、FirefoxChrome、Internet Explorer等);可与多种开发平台相集成(Jenkins,TestNG等);具备丰富的功能扩展插件;支持移动平台测试。

本次搭建的测试平台主要使用的是Selenium3.0,Selenium3.0在Selenium2.0的基础上有了更多的改进,支持的原生驱动方面更为丰富,去掉了对SeleniumRC的支持,JDK的最低版本要求为JDK8,支持IE9+。Selenium3.0组件包括Selenium IDE、Selenium WebDriver以及Selenium Grid。

2.3.2Python工具

Python是一门优雅而健壮的编程语言[7],它继承了传统编译语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性。Python特点是易学习、易阅读、易于维护、具有丰富的库、兼容众多平台、移植性好、可扩展性、可嵌入性以及GUI编程等特点。Python原生自带unittest单元测试框架。

2.3.3Jenkins工具

Jenkins是一个软件界非常流行的开源CI服务器,是基于Java开发的一种免费开源持续集成工具,本项目选中Jenkins作为持续集成服务器,用于监控持续重复的工作,Jenkins的插件机制允许开发者通过定制的方式来执行代码构建、测试、结果展示和通知等工作。工作流程具体如图3所示[8],主要是使用Jenkins来进行执行自动化测试,在本地编写生成批量的测试用例,每天利用测试服务器不断执行这些测试用例,自动检测系统是否平稳运行,有了Jenkins可以自行设置拨测频次进行回归测试,检测到有代码改动,Jenkins就把所有的回归测试的用例全部都执行一遍。

图3 Jenkins工作流程

2.3.4Pytest工具

Pytest是一个非常成熟的全功能的Python第三方库的测试框架[9],该测试框架可以适用于单元测试,用例格式简单,还可以适用WEB自动化测试用例的开发与执行。该工具主要有以下几个特点:简单灵活,方便快捷,易上手;支持参数化;能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appium等自动化测试、接口自动化测试(Pytest+requests);Pytest具有很多第三方插件,对unittest完全兼容,并且可以自定义扩展;可以很好的和Jenkins集成。与unittest相比较,pytest的扩展性和其他方面的功能比unittest更完善。

Pytest的用例组织流程主要包含以下5个部分,如图4所示。

·Test Case即测试用例,所谓的测试用例就是一个完整的测试流程,包括测试前的环境单机、测试代码执行以及测试后的还原。一个测试用例就是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

·Test fixture 的功能主要包括以下三点:传入测试中的数据集,配置测试前系统的初始状态,为批量测试提供数据源。fixture既可以完成一些测试之前的工作(初始化数据),也可以返回数据(测试数据集)给测试函数。在Pytest中,fixture修饰器来标记固定的工厂函数,在其他函数,模块,类或整个工程调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作。

·TestSuite相当于存储测试用例的容器,在繁多的测试用例中,可以任意挑选和组合各种用例集,比如smoke用例集,level1用例集,webtest用例集,bug回归用例集等等,当然这些TestSuite需要提前定义好,并加载用例。与unittest相比,Pytest采取的是完全不同的用例组织和运行方式。用例的运行主要基于名称匹配,组织则基于用例目录,用例命名格式及用例mark标签,这种方式省去了提前定义TestSuite及加载用例的过程,执行时通过路径/用例名格式/不同的标签组合来动态匹配出要执行的用例,使用更加灵活。

·Test Runner和Test Report分别用于执行测试用例和生成测试报告,在本项目中使用了HTMLTestRunner工具。该模块用于生成测试报告,并且以HTML的格式输出。

图4 Pytest用例组织流程

2.4 核心功能模块实现

2.4.1新建及配置测试项目

自动化测试平台搭建完成后,可以登录平台进行测试项目构建和配置,Jenkins提供了功能丰富的操作界面,可以快捷进行一键构建。首先创建新任务,然后配置参数化构建,源码管理,用例脚本等。设置完成,就可以按设置的参数进行手工或自动执行测试。

2.4.2手工和定时触发构建

搭建持续集成自动化测试平台目的是希望在没人的状态下也能自动进行构建和测试,构建分为手工构建和定时触发构建两种方式,采用何种构建方式需要在构建设置中进行配置。

2.4.3定时自动编译和执行测试

在测试项目配置完成后,这里配置每半小时监测测试工程有无新的改动,每次测试脚本有变化将自动获取新的脚本代码进行编译,并能够持续编译、运行测试脚本代码,编译状态改变会自动发送邮件。Jenkins中有各种不同的配置方式,可以在代码check-in之后运行测试脚本,也可以周期性运行测试脚本。

2.4.4测试日志及报告

测试脚本执行时,在工作空间的控制台输出部分能够看到构建的log文件实时更新,可以实时监控构建的过程,一旦发生错误或者构建完成,Log文件就会发送至相关人员。如果构建失败,可以通过查看Log文件,确定构建错误,及时修改代码,并进行下一次的构建。在测试执行完成后,平台自动生成测试报告并发送至指定测试人员。测试人员根据这份测试报告来分析测试任务执行结果是否达到预期目标,又因为是无人值守的测试,所以这份测试报告越详尽越好,以便定位分析问题原因所在。

2.4.5邮件通知

持续集成项目中一个很重要的步骤就是反馈,而最常见的反馈方式就是电子邮件。在构建项目时,本测试平台可以使用Jenkins的邮件通知功能在每次测试完成后将测试结果及时发送给相关人员,通过在Jenkins系统设置中先配置系统管理员邮箱,所有测试结果会通过该邮箱发送。此外还需在平台上配置邮件通知,配置邮件服务器和邮件默认接收人。配置构建后自动发送邮件把构建结果发送给指定人员,以便及时得到测试结果。

2.5 测试脚本实现

2.5.1测试数据与代码相分离的实现

在自动化测试中,最重要的是编写测试脚本来实现所设计的测试用例,在编写测试脚本时把测试数据与测试代码相分离,可以提高代码的可维护性,大大降低维护成本。本平台采用了数据驱动模式,实现了测试数据与代码相分离,将请求地址、请求参数、页面各种文本框待输入的内容以及一些断言数据等各种测试数据全部保存在配置文件中,当测试数据发生改变时,只需要修改数据,不会对主干代码产生影响。在代码中通过读取配置文件来获取数据,方便了代码的后期维护[10]。在实际对项目测试中,通过调用Python的Config模块来实现配置文件的读取操作。

虽然上述将测试数据放在单独的配置文件中,在测试用例中读取需要的测试数据比直接将测试数据放在测试用例代码中看起来要复杂一些,但是这种处理方式却有很大的优点[11],主要如下:

(1)在实际测试中,会同时开展多个环境信息存在差异的项目的测试,此时只需对修改配置文件中的url 等信息进行修改即可,无需逐一修改各项目的数据。这种方法不仅操作简便,而且能够避免了因漏改部分数据而导致的测试出错。

(2)测试过程中的数据与脚本相分离,存放在独立的文件里,方便维护及修改。

(3)如果仅对某个模块的代码进行了修改,若需要对这部分的功能进行验证测试时,只填写需要测试的功能模块即可完成对指定模块的测试,快速得到测试结果,而不必等待较长时间进行全部功能的测试。

2.5.2通过WebDriver访问页面

本自动化测试平台对页面元素的操作都是通过WebDriver提供封装的API来实现的,通过API的封装,使得测试用例编写更加简洁方便。WebDriver是按照Server-client的经典设计模式设计的,它是直接调用浏览器的驱动方法来实现各种操作的,作用就是创建一个新的浏览器实例,也就是启动一个Server端,利用浏览器原生的API,封装成一套更加面向对象的WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(包括截屏,窗口大小,启动,关闭之类)。这种方法使用了浏览器的原生API,极大提高了运行速度,但是需要根据浏览器厂商编写不同的代码。例如Firefox对应使用FirefoxDriver,而Chrome则要用到ChromeDriver等等。其工作原理具体如图5所示[12]:

图5 WebDriver工作原理

2.5.3页面元素定位的实现

自动化测试的核心就是定位元素。为了模拟测试人员对页面的各种元素的手工操作,Selenium必须能够使用某种方式对页面的元素进行定位。页面元素定位方式有很多,目前,常见的定位方式主要有 id、name、tag、link、XPath、CSS等[12],可根据实际情况选择不同的定位方式[13],其中CSS定位和XPath定位是两种更为灵活、复杂但适用范围更广的定位方式。下面是一些定位方式选择原则:

·当页面元素中有id属性时,尽量使用id来定位。但是存在由于代码不规范导致的标准属性缺失情况,有时只能选择其他定位方式。

·当要定位一组相同元素时,可以使用name或者tagname。

·当有链接需要定位时,可考虑使用linkText或者partiailink。

Xpath是XML path的简称,它是一个非常强大的定位方式,可以定位页面中几乎所有的元素,Xpath除了能够精准定位,也支持模糊定位。XPath定位最大的好处是不论前端HTML页面代码是否规范均可进行定位,且定位准确不会出错,像id、name定位之类的当页面不规范,部分元素无这些属性或多个元素有相同属性时无法定位或定位很容易出现偏差。当然,XPath定位也存在一些显著的缺点,它扫描页面所有元素来定位所需元素,性能相比其他定位方式较差,只在少数元素不好定位时使用。

CSS定位使用元素样式选择器来定位,它与XPath定位方式类似,但执行速度会更快些。此定位方式可以选元素的任意属性进行定位,较为灵活,但使用的语法复杂,不易理解。

当由一个窗口调换到另外一个窗口,如果不使用switch_to.window,程序总是默认在第一个窗口中查找元素,这样就导致新界面中的元素无法定位。这时就需要通过switch_to.window(windowhandles)方法来对浏览器页面进行切换,只需要在跳转到新窗口之后切换到最新窗口的句柄,就可以定位到元素了。其中参数windowhandles为网页的窗口句柄。

3 自动化测试平台的应用

3.1 应用情况

目前基于Jenkins+Selenium+Python搭建的自动化测试平台,基本已实现“一键测试”,并应用于国家电网有限公司部分信息系统的自动化测试工作。

我们针对国网公司六个内网信息系统、六个外网系统开展试点测试。测试内容是进行主要页面自动化访问和逐项执行,验证页面是否能够打开,页面响应加载是否及时,核心流程能否走通,并截取对应的页面截图信息,脚本执行完成后自动生成对应自动化测试报告。共执行自动化测试用例37项,实现了把测试脚本分发到不同机器运行,不同执行机之间的文件交互。具体在实际中的应用场景包括日常拨测、故障诊断以及业务流程监控。

3.2 应用场景

应用场景1:故障诊断

自动化测试平台已实现信息系统登录访问故障诊断过程中的智能化、自动化,根据自动化测试报告排查系统具体哪个节点出错。

应用场景2:日常拨测

自动化测试平台支持定时拨测,邮件告警功能。在日常拨测中也能发现系统运行过程中的问题。

应用场景3:业务流程监控

以自动化测试平台运行过程中发现的3个较为典型的问题为例介绍应用成效。

某信息系统1在1月6日10:30-11:30区间系统执行自动化脚本失败,手动核查确实存在获取验证码和登录响应时延过长的问题及加载页面空白问题;

某信息系统2在11月9日10:45特定节点地址输入正确用户名密码登录失败,经排查主要由于登录Sid偶发为空导致;

某信息系统3在11月5日14:45执行自动化脚本失败,报错无法访问此页面。

4 总结与展望

4.1 总结

自动化测试平台引入了Jenkins+selenium+Python等工具,利用Pytest框架编写测试用例,通过TestSuite测试套件将测试用例组织起来,对WEBdirver的API封装了一些常用的页面元素操作方法,使得用例编写更加简洁方便,还基于Jenkins实现了设置定时任务,定时构建自动化测试,自动调用浏览器执行页面自动化测试,还实现了Allure和HtmlHTMLTestRunner模块生成测试报告,可以实现无人值守自动完成测试得到测试结果。并且在自动化测试的过程实现了测试数据、脚本、任务分离,更加易于维护和管理,实现了灵活使用,低成本、数据直观、高效率等目标,甚至能让无编程经验的测试人员参与后续自动化测试工作。另外通过与人工测试相比,自动化测试可以节省了大量时间和人力成本,极大的提升测试效率(≥50%)。

4.2 展望

随着可持续集成自动化测试平台的应用,极大提升了信息系统自动化测试的能力。随着电力企业技术和业务线发展,测试工作也会不断带来新的挑战,自动化测试平台的持续集成是一个周期性的集成测试过程,而且Jenkins具有丰富的插件扩展机制,因此自动化测试平台后续会集成接口自动化工具以及性能测试工具,将来还会考虑集成人工智能、机器学习、Devops装备等技术,以便更好进行自动化测试工作的开展。

[1]金虎. 自动化软件测试技术研究[D]. 成都:四川大学,2006.

[2]李岩峰. WEB和App软件功能与接口自动化测试平台的设计与实现[D]. 北京:北京林业大学,2020.

[3]文丽. 分布式自动化测试框架的研究和实现[D]. 成都:电子科技大学,2011.12.

[4]蒋游泽清. 面向GUI软件的自动化测试框架的研究与实现[D]. 西南大学,2012.

[5]张添. 基于Selenium的Web自动化测试[D]. 北京:北京交通大学,2014.

[6]Wesley J. Chun(宋吉广译). Python核心编程第二版[M]. 北京:人民邮电出版社,2008.

[7]张志朋. 吃透这套架构演化图,从零搭建 Web 网站也不难[EB/OL]. https://www.sohu.com/a/232223366_827544.

[8]贾沃斯基莱德(张亮,阿信译). Python高级编程第2版[M]. 人民邮电出版社,2017.

[9]龚智勇. 基于Selenium的OpenStack Horizon自动化测试的实现[J]. 中国科技核心期刊,2017,36(5):46-47.

[10]Atvl.Python自动化测试[EB/OL]. http://www.51testing.com/html/74/n-4474274.html. 2020.9.27.

[11]赵卓. Selenium自动化测试指南[M]. 北京:人民邮电出版社,2015.

[12]龚智勇. 基于Selenium的OpenStack Horizon自动化测试平台的设计与实现[D]. 武汉:武汉邮电科学研究院,2017.

[13]陈能技. 软件自动化测试之道-典型工具、脚本开发、测试框架和项目实战[M]. 北京:人民邮电出版社,2010.

猜你喜欢

测试用例用例测试数据
UML用例模型中依赖关系的比较与分析
基于SmartUnit的安全通信系统单元测试用例自动生成
联锁软件详细设计的测试需求分析和用例编写
测试数据管理系统设计与实现
從出土文獻用例看王氏父子校讀古書的得失
基于混合遗传算法的回归测试用例集最小化研究
基于自适应粒子群优化算法的测试数据扩增方法
空间co-location挖掘模式在学生体能测试数据中的应用
基于依赖结构的测试用例优先级技术
影响《标准》测试数据真实性的因素及破解策略