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 的自定义字段通过反射找到其相应的处理类,组装完之后,入口通过用例名称执行某个用例,可避免为运行某个用例而执行全部用例。
结构设计:
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 和只打开一个浏览器。
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:程序入口
… …
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 为当实际结果与期望结果不符时,测试报告展示的结果值;
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 给测试用例关联测试计划,两种方式
方式一:编写测试用例后关联到测试计划
方式二:
添加测试用例到测试计划