autestmayn/README.md

13 KiB
Raw Blame History

autest

简介

autest为Auxiliary Test的英文缩写意为辅助测试其中包括日常测试工作中能用到的工具包括测试用例编写工具简化Web UI自动化测试工具以及测试报告生成工具和日常工作中使用的小工具等。开发这个项目的目的在于使用简单的代码来简化我们测试日常中较为繁杂的操作使测试的效率得到一定的提升。

autest设计初衷

autest比起说是一个工具不如说是我在工作中的一个总结在我看来测试工作就是一个机械式的工作既然是机械式的工作就应该用机械来代替抱着这个想法于是我就启动了这个项目。工具第一版实际上是我自己为简化Web UI自动化脚本而做的一个对selenium代码简单的封装但随着工作经验的累积我在工作中越发地发现测试工作中很多的地方都是重复的工作但这个重复的工作又不得不去做并且做这件重复的事情花的时间还不是一般的长比如编写测试用例、编写测试报告于是我便下定决心要把这些工具整合到我的代码中。

另一方面随着自动化测试这个名词逐渐的流行很多的公司跟风要求测试部门也要弄一个自动化出来。当时我在一家公司当测试主管经理也希望我能弄一个自动化。对我而言还好我对java不算精通但也是到熟练的地步了但我的同事就并非都会代码了。面对这一痛点许多的公司都选择使用软件来代替编码我也曾用过这样的软件但对我而言那就是一种痛苦一种有力却使不上的憋屈。很多的操作我通过编码的方式是分分钟能解决的但搬到软件上别人没有提供给你方法你只能干瞪眼。基于这个问题于是我便不断地探寻一种简单的方法来编写脚本并不断地培训同事告诉他们怎么去编写遇到什么样的事件调什么方法在这一方面我还是取得了不错的实践效果的。

但我并不是开发转测试,在大学学习的也是化学工程专业,并未系统地学习过软件工程,所以在编写代码时会有许多与开发规范不符合的地方,关于这点,希望大家能在使用时多多海涵,同时也希望大家能对工具多多批评和指点,我会尽可能地做出改正,使工具更加地完善。

目标

autest的目标是使用代码来简化繁杂的测试工作让测试工作变得轻松同时也让不会写代码的测试工程师开始熟悉代码通过代码编写自动化测试脚本脱离被自动化测试软件束缚让自动化测试变得更加自由。

工具概要

模块 介绍
com.auxiliary.tool 包含日常测试工作中可以使用的测试工具,例如表格处理工具、文本处理工具、日期处理工具等
com.auxiliary.selenium 对Web UI自动化工具selenium的二次封装简化了selenium中比较复杂的代码
com.auxiliary.testcase 用于编写测试用例的工具
com.auxiliary.http 用于做接口测试时使用的工具
com.auxiliary.db 用于对数据库操作的工具

工具介绍

1 测试用例编写工具

该工具是通过预先写好的测试用例文件模板调用其中添加内容的方法对测试用例进行编写之后再生成一个Excel文件以方便测试用例阅读与上传。当然使用代码的方式编写测试用例适用于存在大量替换和模板式测试用例的场景。

首先我们需要创建一个测试用例文件模板xml配置文件文件的创建方法可参考Wiki中《测试用例文件创建》一文此处直接引用项目路径下的jira文件模板可参考/ConfigurationFiles/CaseConfigurationFile/FileTemplet/JiraCaseFileTemplet/jira测试用例导入模板.xml)。

获得文件后我们便可使用测试用例类来编写测试用例。这里我使用项目中已提供的jira用例编写类JiraTestCaseWrite类来进行讲解详细的用例创建方法可参考Wiki中《测试用例编写》《测试用例编写类扩展》两篇文章。

假设我们需要编写姓名、身份证号码和手机号码的测试用例假定姓名可随意输入不设限制身份证为中国公民身份证的校验规则手机号码为一般11位号码表单提交需要点击保存按钮创建的信息为“账号”。则具体的代码为

/**
 * 指向配置文件
 */
final File CONFIG_FILE = new File("ConfigurationFiles/CaseConfigurationFile/FileTemplet/JiraCaseFileTemplet/jira测试用例导入模板.xml");
/**
 * 指向用例文件创建路径
 */
final File CASE_FILE = new File("src/main/java/com/auxiliary/testcase/file/测试用例.xlsx");
/**
 * 指向用例模板文件
 */
final File CASE_TEMP_CONFIG_FILE = new File("ConfigurationFiles/CaseConfigurationFile/CaseTemplet/AddInformation.xml");

/**
 * 测试用例模板类
 */
InformationCase infoCase;
/**
 * jira用例编写类
 */
JiraTestCaseWrite jira;

@BeforeClass
public void initData() throws DocumentException {
	jira = new JiraTestCaseWrite(CONFIG_FILE, CASE_FILE);
	infoCase = new InformationCase(CASE_TEMP_CONFIG_FILE);
	
	//添加需要替换的词语
	infoCase.setReplaceWord(InformationCase.ADD_INFORMATION, "账号");
	infoCase.setReplaceWord(InformationCase.BUTTON_NAME, "保存");
}

@AfterClass
public void openFolder() throws IOException {
	//写入数据到文件中
	jira.writeFile();
}

@Test
public void addCase() {
	jira.setReplactWord("保存", "点击“保存”按钮");
	jira.setReplactWord("成功", "#成功#");
	jira.setReplactWord("失败", "#失败#");
	
	jira.addTitle("通过不同的姓名创建账号")
	.addStep("“姓名”文本框不输入任何信息,#保存#", 
			"在“姓名”文本框中只输入空格,#保存#", 
			"在“姓名”文本框中输入HTML代码#保存#")
	.addExcept("#成功#", 
			"#成功#", 
			"#成功#且HTML代码不会被转义")
	.addModule("/测试项目/账号管理/创建账号")
	.addContent(JiraFieldIdType.PRECONDITION.getName(), "已在创建账号界面", "除姓名字段外,其他信息均正确填写")
	.addContent(JiraFieldIdType.OBJECTIVE.getName(), "验证创建账号界面各个控件输入是否有效")
	.end();
	
	jira.addTitle("通过不同的身份证创建账号")
	.addStepAndExcept("“身份证”文本框不输入任何信息,#保存#", "#失败#")
	.addStepAndExcept("在“身份证”文本框中只输入空格,#保存#", "#失败#")
	.addStepAndExcept("输入15位的证件信息#保存#", "#成功#")
	.addStepAndExcept("输入18位的证件信息#保存#", "#成功#")
	.addStepAndExcept("输入末尾带“X”或“x”的证件信息#保存#", "#成功#")
	.addStepAndExcept("输入大于18位的数字#保存#", "#失败#")
	.addStepAndExcept("输入小于18位但大于15位的数字#保存#", "#失败#")
	.addStepAndExcept("输入小于15位的数字#保存#", "#失败#")
	.addStepAndExcept("输入不符合证件规则但长度符合规则的数字如123456789012345678#保存#", "#失败#")
	.addStepAndExcept("输入非数字字符,#保存#", "#失败#")
	.addModule("/测试项目/账号管理/创建账号")
	.addContent(JiraFieldIdType.PRECONDITION.getName(), "已在创建账号界面", "除身份证字段外,其他信息均正确填写")
	.addContent(JiraFieldIdType.OBJECTIVE.getName(), "验证创建账号界面各个控件输入是否有效")
	.end();
	
	jira.addCase(infoCase.addPhoneCase("手机号码", true, false, false, PhoneType.MOBLE)).end();
}

这里使用了一个模板类来生成身份证的测试用例其实以上的用例都可以用模板来生成模板的使用可以参考Wiki文档的《测试用例模板》。若完全引用模板,则可将代码写成:

final File CONFIG_FILE = new File("ConfigurationFiles/CaseConfigurationFile/FileTemplet/JiraCaseFileTemplet/jira测试用例导入模板.xml");
final File CASE_FILE = new File("src/main/java/com/auxiliary/testcase/file/测试用例.xlsx");
final File CASE_TEMP_CONFIG_FILE = new File("ConfigurationFiles/CaseConfigurationFile/CaseTemplet/AddInformation.xml");

InformationCase infoCase;
JiraTestCaseWrite jira;

@BeforeClass
public void initData() throws DocumentException {
	jira = new JiraTestCaseWrite(CONFIG_FILE, CASE_FILE);
	infoCase = new InformationCase(CASE_TEMP_CONFIG_FILE);
	
	infoCase.setReplaceWord(InformationCase.ADD_INFORMATION, "账号");
	infoCase.setReplaceWord(InformationCase.BUTTON_NAME, "保存");
}

@AfterClass
public void openFolder() throws IOException {
	jira.writeFile();
}

@Test
public void addCase() {
	jira.addCase(infoCase.addBasicTextboxCase("姓名", true, false, false)).end();
	jira.addCase(infoCase.addIdCardCase("身份证号码", true, false, false)).end();
	jira.addCase(infoCase.addPhoneCase("手机号码", true, false, false, PhoneType.MOBLE)).end();
}

2 Web-UI自动化测试工具

在自动化脚本编写的实践过程中我发现selenium有以下的问题

  1. WebDriver类构造比较麻烦特别是指向浏览器驱动的代码不容易记住每次编写脚本时都需要去复制之前的代码
  2. 浏览器配置不方便,需要记住浏览器配置相关的代码,该代码没有智能提示
  3. 元素定位方式无法专门维护selenium提供了一种维护元素定位方式的代码也是现在流行一时的PO模式但该模式我并未对其深究因为我仍发现该模式在调用时仍不方便后面我会提到
  4. 遇到存在iframe标签的元素时需要不断地切换窗体在切换频繁时容易出错
  5. 进行元素操作时会因为各种各样的问题而报错,由于元素操作是独立的,所以需要为每一个元素操作都做一次判断,导致代码冗余
  6. 等待机制使用便捷,同样需要进行封装
  7. 元素操作分布在各个类中,不统一,导致同一个操作可能出现不同的代码,例如点击元素

以上我仅仅也只是大致总结了一些使用selenium代码时常见的问题但事实上在编写的过程还存在各式各样的小问题。针对这些不便的地方结合平时的脚本事件我便对selenium代码进行了一个二次封装把经常出现但又不得不写的代码进行了封装做成单一的方法进行调用以提高脚本编写的速度。代码详细的使用方法我会在Wiki的“Web UI自动化测试”文件夹中放入详细说明这里简单说明一下工具的使用步骤。

2.1 脚本编写需求

指定待测页面为Selenium API网站

https://seleniumhq.github.io/selenium/docs/api/java/index.html

之后我们按照以下步骤进行操作:

  1. 点击页面左上角的“FRAMES”
  2. 点击“Packages”窗口中的“org.openqa.selenium.chrome”
  3. 点击下方窗口的“ChromeDriver”
  4. 获取类中所有的构造方法从“Constructor Summary”表格中获取

2.2 录制元素

采用xml文件的形式记录所需要操作的元素内容为

2.3 启动浏览器并加载页面

要进行页面的自动化首先需要启动浏览器并加载待测页面。以谷歌浏览器为例谷歌浏览器驱动定义在项目路径根目录下启动浏览器并加载Selenium API页面的代码可写为

@Test
public void openBrower() {
	//指向谷歌驱动位置
	File driverFile = new File("chromedriver.exe");
	//待测页面名称
	String pageName = "selenium";
	//待测站点
	String url = "https://seleniumhq.github.io/selenium/docs/api/java/index.html";
	//构造浏览器对象
	ChromeBrower chrome = new ChromeBrower(driverFile, url, pageName);
	//设置浏览器全屏
	chrome.addConfig(ChromeOptionType.SET_WINDOW_MAX_SIZE);
	//启动浏览器可返回WebDriver对象
	chrome.getDriver();
	//关闭浏览器
	chrome.closeBrower();
}

2.4 操作元素

2.5 完整代码

根据以上的说明将代码放入TestNG框架中完整的代码为