修改自述文件内容,添加测试用例模板使用

This commit is contained in:
彭宇琦 2020-08-09 15:14:13 +08:00
parent 673c93f5c6
commit 65facbd657
3 changed files with 225 additions and 67 deletions

205
README.md
View File

@ -2,6 +2,7 @@
## 简介
### autest设计初衷
autest为Auxiliary Test的英文缩写意为辅助测试其中包括日常测试工作中能用到的工具包括测试用例编写工具简化Web UI自动化测试工具以及测试报告生成工具和日常工作中使用的小工具等。开发这个项目的目的在于使用简单的代码来简化我们测试日常中较为繁杂的操作使测试的效率得到一定的提升。
autest比起说是一个工具不如说是我在工作中的一个总结在我看来测试工作就是一个机械式的工作既然是机械式的工作就应该用机械来代替抱着这个想法于是我就启动了这个项目。但我并不是开发转测试在大学学习的也是化学工程专业并未系统地学习过软件工程所以在编写代码时会有许多与开发规范不符合的地方关于这点希望大家能在使用时多多海涵同时也希望大家能对工具多多批评和指点我会尽可能地做出改正使工具更加地完善。
### 目标
autest的目标是使用代码来简化繁杂的测试工作让测试工作变得轻松同时也让不会写代码的测试工程师开始熟悉代码通过代码编写自动化测试脚本脱离被自动化测试软件束缚让自动化测试变得更加自由。
@ -22,6 +23,7 @@ autest的目标是使用代码来简化繁杂的测试工作让测试工作
#### 1.1 测试用例文件创建
##### 1.1.1 测试用例模板配置文件创建
在编写测试用例时,我们需要有一个存放测试用例的文件,之后在文件中编写测试用例,程序中也不例外,首先我们需要创建测试用例模板文件,该模板文件可以是自行创建,也可以是根据配置文件中编写的内容,通过程序进行创建,个人建议选择后者,因为我们创建的配置文件模板是符合我们在类中定义的字段位置的,若是通过自行创建的模板,此时可能遗漏字段或字段位置有误,导致程序失效。下面将介绍如何使用配置文件来创建测试用例模板。
首先配置文件采用xml的文件形式其内容主要是对测试用例模板文件中一些基本的参数进行配置例如行宽、字段名称、是否居中等等其结构如下
```xml
<?xml version='1.0' encoding='UTF-8'?>
@ -168,13 +170,14 @@ public void createCaseTemplate() {
<datas id='关键用例'>
<data name='是' />
<data name='否' />
</datas>
</datas
<sheet/>
</templet>
```
得到测试用例模板文件后我们则需要通过用例模板文件对象和创建模板使用的xml文件对象来构造编写测试用例的类对象这里我们需要调用包中的BasicTestCaseWrite类框架选用TestNG
```java
/**
* 写在方法外,便于在测试方法中调用
* 用例编写类
*/
BasicTestCaseWrite wtc;
/**
@ -358,22 +361,29 @@ public void addCase() {
.end();
}
```
运行测试方法后,可以生成如下图的效果:<br>
![image](https://github.com/pyqone/autest/blob/master/Readme/Image/TestCase/TestCase1.png)<br>
运行测试方法后,可以生成如下图的效果:
![image](https://github.com/pyqone/autest/blob/master/Readme/Image/TestCase/TestCase1.png)
类中还提供了对字段内容进行删除、替换和插入的方法,用法基本与添加测试用例方法类似,这里就不过多赘述,您可参考工具的文档,选择性使用。
***需要注意的是在编写完一条测试用例后一定要在末尾加上end()方法,否则该条测试用例不会被记录。***
##### 1.2.3 添加字段常量
在上述测试用例中,可以很明显地看出,部分字段的内容其实是重复的,但每一条用例都必须要包含,故需要引入常量的概念,通过对字段设置一次内容,使其在每次执行时会自动将字段的内容填写至测试用例中。当然,通过该方法设置的字段值并非真正意义上的常量,其值是可以改变的,可根据需要,实时改变字段相应的值。调用的方法为:
```
```java
setFieldValue(String field, String content)
```
其方法第一个参数为需要写入的字段名,第二个参数为需要在该字段中写入的内容,需要注意的是,字段内容参数不是可变参数,只能传入一个值,需要自行换行。
于是,在上一节中,我们编写的代码则可以改为(由于代码过长,故省略掉添加身份证测试用例的代码,以方便查看)
于是,在上一节中,我们编写的代码则可以改为:
```java
/**
* 写在方法外,便于在测试方法中调用
* 用例编写类
*/
BasicTestCaseWrite wtc;
/**
@ -431,14 +441,189 @@ public void addCase() {
.addContent("优先级", "2")
.addContent("关键用例", "2")
.end();
//添加身份证相关的用例
wtc.addContent("标题", "通过不同的身份证创建账号")
.addContent("前置条件",
"已在创建账号界面",
"除姓身份证段外,其他信息均正确填写"
)
.addContent("步骤",
"“身份证”文本框不输入任何信息,点击“保存”按钮",
"在“身份证”文本框中只输入空格,点击“保存”按钮",
"输入15位的证件信息点击“保存”按钮",
"输入18位的证件信息点击“保存”按钮",
"输入末尾带“X”或“x”的证件信息点击“保存”按钮",
"输入大于18位的数字点击“保存”按钮",
"输入小于18位但大于15位的数字点击“保存”按钮",
"输入小于15位的数字点击“保存”按钮",
"输入不符合证件规则但长度符合规则的数字如123456789012345678点击“保存”按钮",
"输入非数字字符,点击“保存”按钮"
)
.addContent("预期",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示",
"账号创建成功",
"账号创建成功",
"账号创建成功",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示"
)
.addContent("优先级", "1")
.addContent("关键用例", "1")
.end();
}
```
##### 1.2.4 添加词语替换
在上一节中,我们虽然用常量代替了部分内容,但在用例步骤与预期中仍然存在较多的重复内容,这些内容无法用常量代替。为解决这一问题,类中还提供了一个词语替换的方法,先在使用标记前,对需要替换的词语设置好以后,在文本中使用“#内容#”进行标记即可。替换词语的方法为:
```java
setReplactWord(String word, String replactWord)
```
方法中,第一个参数表示需要替换的词语,第二个参数表示替换的内容。在传入需要替换的词语时无需加上两个“#”符号。根据上一节编写的测试方法,加上替换词语的方法后,可以将测试方法改写为如下形式:
```java
@Test
public void addCase() {
wtc.setFieldValue("界面", "已在创建账号界面");
wtc.setFieldValue("填写", "其他信息均正确填写");
wtc.setFieldValue("保存", "点击“保存”按钮");
wtc.setFieldValue("成功", "账号创建成功");
wtc.setFieldValue("失败", "账号创建失败,并给出相应的提示");
//添加姓名相关的用例
wtc.addContent("标题", "通过不同的姓名创建账号")
.addContent("前置条件", "#界面#", "除姓名字段外,#填写#")
.addContent("步骤",
"“姓名”文本框不输入任何信息,#保存#",
"在“姓名”文本框中只输入空格,#保存#",
"在“姓名”文本框中输入HTML代码#保存#"
)
.addContent("预期",
"#成功#",
"#成功#",
"#成功#且HTML代码不会被转义"
)
.addContent("优先级", "2")
.addContent("关键用例", "2")
.end();
//添加身份证相关的用例
wtc.addContent("标题", "通过不同的身份证创建账号")
.addContent("前置条件", "#界面#", "除姓身份证段外,#填写#")
.addContent("步骤",
"“身份证”文本框不输入任何信息,#保存#",
"在“身份证”文本框中只输入空格,#保存#",
"输入15位的证件信息#保存#",
"输入18位的证件信息#保存#",
"输入末尾带“X”或“x”的证件信息#保存#",
"输入大于18位的数字#保存#",
"输入小于18位但大于15位的数字#保存#",
"输入小于15位的数字#保存#",
"输入不符合证件规则但长度符合规则的数字如123456789012345678#保存#",
"输入非数字字符,#保存#"
)
.addContent("预期",
"#失败#",
"#失败#",
"#成功#",
"#成功#",
"#成功#",
"#失败#",
"#失败#",
"#失败#",
"#失败#",
"#失败#"
)
.addContent("优先级", "1")
.addContent("关键用例", "1")
.end();
}
```
**需要注意以下几点:**
1. 标记的词语被重复定义替换的内容时,其替换的内容以最后一次修改为准
2. 在文本中,若使用了未被定义的词语,则不会被替换,保留原始内容(包括标记符号)
#### 1.3 测试用例模板
一般情况下,我们编写的测试用例大多都是重复的,根据需求描述中相应的规则,对这一类的测试用例进行一定的修改,一条新的用例就写好了。同样的,在程序中,也同样可以使用模板的方式来添加测试用例。当前工具中已提供了部分测试用例模板,可直接调用使用。当然,工具中提供的测试用例模板是按照我的想法写的,可能不能保证您写的用例也是如此,所以在工具中有提供模板的扩展,可供使用。下面先简单介绍测试用例模板写入到测试用例中的方法。
##### 1.3.1 测试用例模板使用
在工具中,我简单编写了添加信息、浏览列表以及地图操作等相关的测试用例,这里就简单介绍如何使用模板。
要使用测试用例模板首先需要对用例模板的内容进行存储同样存储模板也是用过xml文件的形式。由于模板是已经写好的内容过长就不在这里展示可在项目下的“ConfigurationFiles/CaseConfigurationFile/CaseTemplet”文件夹中找到所有的模板。
在上一节中,我们编写的新增账号时对身份证和姓名的测试用例实际可以使用模板来进行代替,使用的模板就是添加信息模板,通过调用测试用例模板类中的方法,从而达到添加测试用例的目的。
首先我们需要构造信息编辑用例模板类InformationCase并将测试用例模板中的字段与测试用例文件模板的字段进行一个关联由于测试用例模板配置文件的写法是固定的所以我们只需要定义一次用例模板字段即可。关联测试用例的方法为
```java
relevanceCase(String field, String labelType)
```
其第一个参数为在测试用例文件模板xml文件中的字段id第二个参数为测试用例模板中的标签名称该名称可以通过LabelType枚举类进行获取亦可直接填入。为便于今后的扩展故没有把labelType参数作为枚举故在获取到枚举值后再调用枚举中的getName()方法进行,返回相应的标签名称。
在得到类对象后我们还需要对模板中部分内容进行替换就如同您从其他位置将模板内容复制到excel中然后逐个替换为所需要的内容一样。替换词语的方法为
```java
setReplaceWord(String word, String text)
```
用法与用例编写类中的替换词语方法类似,需要替换的词语可以使用类名调用,您可选择性使用并进行替换。建议您在查看用例模板后,尽可能替换相应的内容。
了解上述两个方法后,于是我们需要修改上一节中的前置条件方法:
```java
@BeforeClass
public void createTemplet() throws DocumentException, IOException {
//创建测试用例模板文件
CreateCaseFile temp = new CreateCaseFile(conFile, tempFile);
temp.setCoverFile(true);
temp.create();
//构造用例编写类对象
wtc = new BasicTestCaseWrite(conFile, tempFile);
//添加常量词语
wtc.setFieldValue("模块", "/测试项目/账号管理/创建账号");
wtc.setFieldValue("目的", "验证创建账号界面各个控件输入是否有效");
wtc.setFieldValue("状态", "1");
wtc.setFieldValue("设计者", "test");
wtc.setFieldValue("关联需求", "TEST-1");
//添加与测试用例模板的字段关联
wtc.relevanceCase("步骤", LabelType.STEP.getName());
wtc.relevanceCase("预期", LabelType.EXCEPT.getName());
wtc.relevanceCase("前置条件", LabelType.PRECONDITION.getName());
wtc.relevanceCase("优先级", LabelType.RANK.getName());
wtc.relevanceCase("标题", LabelType.TITLE.getName());
//构造测试用例模板类对象
ic = new InformationCase(caseTempFile);
//添加需要替换的词语
ic.setReplaceWord(InformationCase.ADD_INFORMATION, "账号");
ic.setReplaceWord(InformationCase.BUTTON_NAME, "保存");
}
```
当我们完成以上构造后,我们只需要调用方法,写入测试用例模板即可,这里需要使用以下方法,首先测试用例编写类中写入测试用例模板文本的方法:
```java
addCase(Case testCase)
```
传入的参数为继承至Case类的测试用例模板类。在案例中姓名与身份证分别用到测试用例模板的以下方法
```java
//添加姓名
addBasicTextboxCase(String name, boolean isMust, boolean isRepeat, boolean isClear, InputRuleType... inputRuleTypes)
//添加身份证
addIdCardCase(String name, boolean isMust, boolean isRepeat, boolean isClear)
```
在方法中各个参数表示控件的个性化内容由于参数过多就不大篇幅介绍您可以参考项目的API文档。于是我们可以将上一节中的测试方法改为
```java
@Test
public void addCase() {
wtc.addCase(ic.addBasicTextboxCase("姓名", false, true, false)).end();
wtc.addCase(ic.addIdCardCase("身份证", true, false, false)).end();
}
```
##### 1.3.2 测试用例模板扩展
#### 1.4 测试用例字段标记
#### 1.5 测试用例模板扩展
##### 1.5.1 测试用例字段xml文件的编写
##### 1.5.2 测试用例模板类基类的继承
#### 1.5 测试用例编写类扩展
##### 1.5.1 jira测试用例编写类的使用
##### 1.5.2 自定义测试用例编写类
##### 1.5.3 测试用例模板类字段枚举(可选)

View File

@ -198,14 +198,14 @@ public abstract class AbstractTestCaseWrite<T extends AbstractTestCaseWrite<T>>
* @param caseLabel 测试用例生成方法的字段
* @throws LabelNotFoundException 当在sheet标签中查不到相应的单元格id不存在时抛出的异常
*/
public void relevanceCase(String field, String caseLabel) {
public void relevanceCase(String field, String labelType) {
// 判断字段是否存在若不存在则抛出异常
if (!fieldMap.containsKey(field)) {
throw new LabelNotFoundException("当前sheet不存在的标签id" + field);
}
// 添加字段
relevanceMap.put(field, caseLabel);
relevanceMap.put(field, labelType);
}

View File

@ -10,12 +10,20 @@ import org.testng.annotations.Test;
import pres.auxiliary.work.testcase.file.BasicTestCaseWrite;
import pres.auxiliary.work.testcase.file.CreateCaseFile;
import pres.auxiliary.work.testcase.file.JiraTestCaseWrite.JiraFieldIdType;
import pres.auxiliary.work.testcase.templet.InformationCase;
import pres.auxiliary.work.testcase.templet.LabelType;
public class TestWriteCase {
/**
* 写在方法外便于在测试方法中调用
* 用例编写类
*/
BasicTestCaseWrite wtc;
/**
* 添加信息用例模板类
*/
InformationCase ic;
/**
* 配置文件类对象
*/
@ -25,6 +33,10 @@ public class TestWriteCase {
* 模板文件类对象
*/
File tempFile = new File("Result/测试用例.xlsx");
/**
* 添加信息类测试用例模板文件
*/
File caseTempFile = new File("ConfigurationFiles/CaseConfigurationFile/CaseTemplet/AddInformation.xml");
@BeforeClass
public void createTemplet() throws DocumentException, IOException {
@ -42,6 +54,19 @@ public class TestWriteCase {
wtc.setFieldValue("状态", "1");
wtc.setFieldValue("设计者", "test");
wtc.setFieldValue("关联需求", "TEST-1");
//添加与测试用例模板的字段关联
wtc.relevanceCase("步骤", LabelType.STEP.getName());
wtc.relevanceCase("预期", LabelType.EXCEPT.getName());
wtc.relevanceCase("前置条件", LabelType.PRECONDITION.getName());
wtc.relevanceCase("优先级", LabelType.RANK.getName());
wtc.relevanceCase("标题", LabelType.TITLE.getName());
//构造测试用例模板类对象
ic = new InformationCase(caseTempFile);
//添加需要替换的词语
ic.setReplaceWord(InformationCase.ADD_INFORMATION, "账号");
ic.setReplaceWord(InformationCase.BUTTON_NAME, "保存");
}
@AfterClass
@ -52,59 +77,7 @@ public class TestWriteCase {
@Test
public void addCase() {
//添加姓名相关的用例
wtc.addContent("标题", "通过不同的姓名创建账号")
.addContent("前置条件",
"已在创建账号界面",
"除姓名字段外,其他信息均正确填写"
)
.addContent("步骤",
"“姓名”文本框不输入任何信息,点击“保存”按钮",
"在“姓名”文本框中只输入空格,点击“保存”按钮",
"在“姓名”文本框中输入HTML代码点击“保存”按钮"
)
.addContent("预期",
"账号创建成功",
"账号创建成功",
"账号创建成功且HTML代码不会被转义"
)
.addContent("优先级", "2")
.addContent("关键用例", "2")
.end();
//添加身份证相关的用例
wtc.addContent("标题", "通过不同的身份证创建账号")
.addContent("目的", "验证创建账号界面各个控件输入是否有效")
.addContent("前置条件",
"已在创建账号界面",
"除姓身份证段外,其他信息均正确填写"
)
.addContent("步骤",
"“身份证”文本框不输入任何信息,点击“保存”按钮",
"在“身份证”文本框中只输入空格,点击“保存”按钮",
"输入15位的证件信息点击“保存”按钮",
"输入18位的证件信息点击“保存”按钮",
"输入末尾带“X”或“x”的证件信息点击“保存”按钮",
"输入大于18位的数字点击“保存”按钮",
"输入小于18位但大于15位的数字点击“保存”按钮",
"输入小于15位的数字点击“保存”按钮",
"输入不符合证件规则但长度符合规则的数字如123456789012345678点击“保存”按钮",
"输入非数字字符,点击“保存”按钮"
)
.addContent("预期",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示",
"账号创建成功",
"账号创建成功",
"账号创建成功",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示",
"账号创建失败,并给出相应的提示"
)
.addContent("优先级", "1")
.addContent("关键用例", "1")
.end();
wtc.addCase(ic.addBasicTextboxCase("姓名", false, true, false)).end();
wtc.addCase(ic.addIdCardCase("身份证", true, false, false)).end();
}
}