自动化工具 基于 java+selenium+maven + testlink+ testng+ extentreport+ git+ Jenkins 的自动化测试

唐一凡 for 杭州数云测试团队 · 2022年03月31日 · 最后由 攀爬从心开始 回复于 2022年06月10日 · 4037 次阅读

1.说明
用到的技术:
java:项目的编程语言
selenium:web 项目底层服务驱动框架
maven:项目类型,方便管理 jar 包
testlink:测试用例管理工具
testng:项目运行框架,执行测试用例,生成测试报告
extentreport:美化 testng
git:仓库管理工具,管理项目代码
jenkins:持续集成平台,自动编译,自动打包

2.概要设计

testlink 的 jar 包 [ https://mvnrepository.com/ 搜索 testlink ]


br.eti.kinoshita
testlink-java-api
1.9.16-1

2.2 工程结构设计
思路:

将 testlink 的 testsuit,testcase,step 在工程中按照其结构先组装起来,step 的自定义字段通过反射找到其相应的处理类,组装完之后,入口通过用例名称执行某个用例,可避免为运行某个用例而执行全部用例。

结构设计:

  1. 详细设计 3.1 类图 3.2 工程主要功能设计说明 3.2.1 testlink 中的用例及步骤实例化成一个 testsuit 对象 3.2.1.1 先定义 testsuit l 按照概要设计的分析,容器的选择如下:

ParseTestSuite:
private LinkedHashMap caseMap;

ParseTestCase:
private List steps;
l step 中有自定义的字段,枚举列出来,放到 map 中,在 testlink 的 step 中输入关键字,可找到相应的处理类。
ParseTestStep:
private StepAction action;
private … …

StepAction:
WEB_GETURL("web-geturl", "Web 端打开网站链接操作", GetUrlActionHandler.class),
WEB_INPUT("web-input", "Web 端输入操作", InputActionHandler.class),
… …
private static Map map;
static{

map = new HashMap();

for(StepAction action : StepAction.values()){

map.put(action.key(), action);

}

}
//只执行一次,初始化时,将 testlink 的每个 step 的 action 放入 map,用时直接 get 出来。
3.2.1.2 实例化 testsuit
TestLinkParseService:
public static ParseTestSuite getTestSuite(String planName, String projectName){

AppointFirefoxDriver();

TestLinkAPI api=connectTestLink();

ParseTestCase parseTestCase=null;
… …
//循环遍历 testlink 的 testcase 和 teststep,并将 testcase 和 teststep 实例化。
}
//连接 testlink 和生成 driver,只能在实例化 testsuit 时完成,为保证只连接一次 testlink,和只打开一个浏览器,以免重复登录。

public static T initByReflect(String name,String value,T t) {… …}
//反射,实例化 testcase 和 teststep 时 set 相应的属性。
3.2.2 入口及调用
入口为 extentReport.xml(可直接生成测试报告),extentReport 是为 testng 美化测试报告用的,核心入口实为 testng.xml,testng.xml 中配置要调用的类和方法。

3.2.2.1 入口
在 pom.xml 配置工程的入口:

<!-- 关联 testng.xml -->
org.apache.maven.plugins

maven-surefire-plugin

2.19

true

src/main/resources/extentReport.xml

org.apache.maven.plugins

maven-jar-plugin

TestSuite.AskForPayment


3.2.2.2 调用
AskForPayment:
static {

String planName= TestLinkParseService.getTestLinkProperties("planename");

String projectName=TestLinkParseService.getTestLinkProperties("projectname");

ParseTestSuite parseTestSuite=TestLinkParseService.getTestSuite(planName,projectName);

testLinkRunService=new TestLinkRunService(parseTestSuite);

}
//通过 planName、projectName 实例化一个 testsuit,结构体目的是只执行一次,只连接一次 testlink 和只打开一个浏览器。

@Test

private void 验证登录数据赢家打开事件关怀催付页面正常 () throws Exception {

String case1=TestLinkParseService.getTestLinkProperties("testcase1");

testLinkRunService.runTestCase(case1);

testLinkRunService.TestReportRemarks("登录数据赢家打开事件关怀催付页面正常");

}
//中文的方法名目的是生成测试报告时更直观展示,通过测试用例名称执行相应的步骤。
TestLinkRunService:
public ParseTestCase getParseTestCase(String caseName){… …}
//通过用例名称从实例化的 testsuit 中获取 testcase 对象。

public void runTestCase(String caseName) throws Exception {

ParseTestCase parseTestCase= getParseTestCase(caseName);

List parseTestSteps= parseTestCase.getSteps();

for(ParseTestStep parseTestStep:parseTestSteps){

StepAction stepAction=parseTestStep.getAction();

Class<?> clss=stepAction.handler();

String key=stepAction.key();

String handlerMethodName=getMethodName(key);

Method method=clss.getDeclaredMethod(handlerMethodName,new Class<?>[]{ParseTestStep.class});

method.invoke(clss.newInstance(),parseTestStep);

}

}
//将 StepAction 和 handler 的类关联上,执行相应处理类
3.2.3 自动化处理(selenium)类
GetUrlActionHandler:
public void webGeturl(ParseTestStep step) throws Exception {
… …

Cookie cookie=new Cookie("sy-cook","f0d9438beebcb7707dae507650a29877","/");
step.getWebDriver().manage().addCookie(cookie);
… …
}
//放入 cookie,登录可跳过验证码,cookie 值每个账号固定不变。//f0d9438beebcb7707dae507650a29877 为账号 ty01 的固定 cookie 值。

CheckActionHandler:
InputActionHandler:
……
均调用 selenium 封装的方法
3.2.4 工具类
SeleniumUtil:对 selenium 二次加工
TestlinkUtil:连接 testlink
… …
3.2.5 resource
testlink.properties:testlink 的相关配置

common.properties:浏览器驱动的相关配置

testing.xml:程序入口

… …

  1. 使用说明 在 testlink 测试步骤的写法示例: action="web-geturl" value="http://XXX/login.html" desc="访问网站域名"

action="web-input" locator="xpath=/html/body/div[2]/div/div/div[1]/form/div[1]/div[1]/input" value="ty01" desc="输入账号"

action="web-click" locator="xpath=.//*[@id='loginBtn']" desc="点击登录按钮"

action="web-check" locator="xpath=/html/body/ui-view/section/div/ui-view/section/h2" expect="事件实时监控" message="访问失败" desc="检查主页面"

action 可填的值为其枚举值;

locator 可填的值为 id、name、xpath、tagName、className、linkText、partialLinkText、cssSelector;

value 为 input 时需要输入的值;

expect 为期望结果值;

message 为当实际结果与期望结果不符时,测试报告展示的结果值;

  1. jenkins 和 testlink 集成 jenkins 将测试用例执行结果写入 testlink。

5.1 配置 jenkins
5.1 .1 jenkins 全局工具配置
配置 jdk

不需要自动安装。

配置 maven

系统配置—全局工具配置—maven


装 maven 插件 Maven Integration

点击标题,打开使用说明。

5.1.2 系统设置
设置语言,locale 是一个插件

设置 testlink plugin

http://localhost/testlink/lib/api/xmlrpc/v1/xmlrpc.php

5.1.3 任务配置

配置目录,对应文件夹为
配置 git,安装 git 插件
5.1.4 配置 testlink plugin(插件)
将打包运行出的测试结果写入 testlink。

说明:testlink plugin 插件需要与 testlink 版本对应,否则不能使用。

https://wiki.jenkins.io/display/JENKINS/TestLink+Plugin 插件使用说明网址

对应版本

http://updates.jenkins-ci.org/download/plugins/testlink/ 下载与 testlink 对应版本的 testlink plugin 插件

testlink 1.9.16 测试了几个 testlink plugin 插件

3.3 及以上可用,任务配置 testlink 时用 testng method 时报错,解决方法使用 juit method;
3.2 jenkins 构建报错。
我目前使用 3.4

插件安装:

管理插件—高级—上传插件

重启 jenkins:http://localhost:8080/restart

具体配置如下:

项目计划和项目名称最后用英文,中文不识别。

buildName:设置自增长。

Custom Fields:自定义的关键字。

goals:clean compile—先清除再编译。

clean package—先清除再打包。

给对应测试用例执行相应的结果:

在 jenkins 上显示报告(由于 testlink 的报告有 html 样式,jenkins 有安全设置不显示 html 样式,所以用此报告):

l 配置邮件

5.2 testlink 设计测试用例
版本 1.9.16,好用。

l 自定义字段里管理,新建自定义字段

l 指派自定义字段

l 测试项目和测试计划名称用英文命名

l 编写测试用例

填写自定义字段,一定要将测试用例的测试方式设置成自动的,否则 jenkins 取不到此测试用例。

l 给测试用例关联测试计划,两种方式

方式一:编写测试用例后关联到测试计划

方式二:

添加测试用例到测试计划

  1. 测试报告 构建任务,出现如下结果,说明构建成功,及将测试结果已写入 testlink。 l Jenkins 报告: l testlink 自动写入的结果:
共收到 2 条回复 时间 点赞
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册