Conflicts:
	src/test/java/pres/readme/code/MyCase.java
This commit is contained in:
DESKTOP-KM6N197\pyqon 2020-09-06 11:57:57 +08:00
commit 2caa9b12af
34 changed files with 1496 additions and 480 deletions

View File

@ -1,55 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<templet>
<sheet name="测试用例" freeze="3">
<column id="case_id" name="用例编号" wide="17" align="center" link="运行记录|case_id"/>
<column id="module" name="所属模块" wide="25" align="center"/>
<sheet name="测试用例" freeze="2">
<column id="case_id" name="用例编号" wide="17" align="center"/>
<column id="title" name="用例标题" wide="30" align="left"/>
<column id="step" name="步骤" wide="45" align="left"/>
<column id="expect" name="预期" wide="45" align="left"/>
<column id="condition" name="前置条件" wide="30" align="left"/>
<column id="flow" name="所属流程" wide="13" align="center"/>
<column id="condition" name="前置条件" wide="30" align="left" index='true'/>
</sheet>
<sheet name="运行记录" freeze="6" >
<sheet name="运行记录" freeze="5" >
<column id="id" name="序号" wide="8" align="center"/>
<column id="case_id" name="用例编号" wide="17" align="center" link="测试用例|case_id"/>
<column id="case_id" name="用例编号" wide="17" align="center"/>
<column id="class_name" name="类名" wide="25" align="left"/>
<column id="method_name" name="方法名" wide="15" align="left"/>
<column id="state" name="执行状态" wide="10" align="center" link="错误记录|id"/>
<column id="step" name="执行步骤" wide="25" align="left"/>
<column id="result" name="执行结果" wide="25" align="left"/>
<column id="condition" name="前置条件" wide="25" align="left"/>
<column id="mark" name="备注" wide="25" align="left"/>
<column id="state" name="执行状态" wide="10" align="center"/>
<column id="step" name="执行步骤" wide="25" align="left" index='true'/>
<column id="result" name="执行结果" wide="25" align="left" index='true'/>
<column id="bug_number" name="Bug数量" wide="10" align="center"/>
<column id="screenshot_position" name="截图位置" wide="25" align="center" link="运行记录截图|id"/>
<column id="use_time" name="执行耗时(s)" wide="15" align="center"/>
<column id="screenshot_position" name="截图位置" wide="25" align="center"/>
<column id="use_time" name="执行耗时" wide="15" align="center"/>
<column id="active_person" name="执行者" wide="20" align="center"/>
<column id="active_time" name="执行时间" wide="12" align="center"/>
<column id="brower" name="浏览器" wide="12" align="center"/>
<column id="version" name="版本" wide="12" align="center"/>
<column id="system" name="操作系统" wide="12" align="center"/>
</sheet>
<sheet name="运行记录截图" freeze="0">
<column id="id" name="序号" wide="8" align="center"/>
<column id="class_name" name="类名" wide="25" align="left"/>
<column id="method_name" name="方法名" wide="15" align="left" link="运行记录|id"/>
<column id="screenshot" name="截图" wide="25" align="left" link="本地"/>
<column id="mark" name="备注" wide="25" align="left"/>
<datas id='state'>
<data name='正常' />
<data name='异常' />
</datas>
</sheet>
<sheet name="错误记录" freeze="4">
<column id="id" name="序号" wide="8" align="center"/>
<column id="class_name" name="类名" wide="25" align="left"/>
<column id="method_name" name="方法名" wide="15" align="left" link="运行记录|id"/>
<column id="error_step" name="错误步骤" wide="25" align="left"/>
<column id="error_class" name="异常类" wide="25" align="left"/>
<column id="error_information" name="异常信息" wide="25" align="left"/>
<column id="screenshot_position" name="截图位置" wide="25" align="left" link="错误记录截图|id"/>
</sheet>
<sheet name="错误记录截图" freeze="0">
<column id="id" name="序号" wide="8" align="center"/>
<column id="class_name" name="类名" wide="25" align="left"/>
<column id="method_name" name="方法名" wide="15" align="left" link="错误记录|id"/>
<column id="screenshot" name="截图" wide="25" align="left" link="本地"/>
<column id="method_name" name="方法名" wide="15" align="left"/>
<column id="error_step" name="错误步骤" wide="25" align="left" index='true' row_text='1'/>
<column id="error_class" name="异常类" wide="25" align="left" index='true' row_text='1'/>
<column id="error_information" name="异常信息" wide="25" align="left" index='true' row_text='1'/>
<column id="screenshot_position" name="截图位置" wide="25" align="left" index='true' row_text='1'/>
</sheet>
</templet>

BIN
Result/测试用例.xlsx Normal file

Binary file not shown.

View File

@ -0,0 +1,52 @@
package pres.auxiliary.tool.file.excel;
/**
* <p><b>文件名</b>LinkType.java</p>
* <p><b>用途</b>
* 用于枚举excel中可用的超链接类型
* </p>
* <p><b>编码时间</b>2020年8月22日下午4:43:35</p>
* <p><b>修改时间</b>2020年8月22日下午4:43:35</p>
* @author 彭宇琦
* @version Ver1.0
*
*/
public enum LinkType {
/**
* 表示文件超链接
*/
FILE("file"),
/**
* 表示网页超链接
*/
URL("url"),
/**
* 表示邮箱超链接
*/
EMAIL("email"),
/**
* 表示文档内超链接
*/
DOMCUMENT("dom");
/**
* 用于标记超链接名称
*/
private String name;
/**
* 初始化枚举的名称
* @param name 枚举名称
*/
private LinkType(String name) {
this.name = name;
}
/**
* 用于返回枚举的名称
* @return 枚举名称
*/
public String getName() {
return name;
}
}

View File

@ -0,0 +1,38 @@
package pres.auxiliary.tool.file.excel;
/**
* <p><b>文件名</b>NoSuchTypeException.java</p>
* <p><b>用途</b>
* 当枚举类型不存在时抛出的异常
* </p>
* <p><b>编码时间</b>2020年8月22日下午4:40:44</p>
* <p><b>修改时间</b>2020年8月22日下午4:40:44</p>
* @author 彭宇琦
* @version Ver1.0
*
*/
public class NoSuchTypeException extends RuntimeException {
private static final long serialVersionUID = 1L;
public NoSuchTypeException() {
super();
}
public NoSuchTypeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public NoSuchTypeException(String message, Throwable cause) {
super(message, cause);
}
public NoSuchTypeException(String message) {
super(message);
}
public NoSuchTypeException(Throwable cause) {
super(cause);
}
}

View File

@ -0,0 +1,22 @@
package pres.auxiliary.tool.file.excel;
/**
* <p><b>文件名</b>ReplactFunction.java</p>
* <p><b>用途</b>
* 用于根据替换词语设置相应的替换方法并在读取到该词语时执行设置方法的接口
* </p>
* <p><b>编码时间</b>2020年9月3日上午8:24:58</p>
* <p><b>修改时间</b>2020年9月3日上午8:24:58</p>
* @author 彭宇琦
* @version Ver1.0
*
*/
public interface ReplactFunction {
/**
* 根据替换的词语以及在该位置上的原始内容对词语所在位置内容进行替换
* @param replactWord 需要替换的词语
* @param value 原始内容
* @return 被替换的内容
*/
public String replact(String replactWord, String value);
}

View File

@ -371,6 +371,7 @@ public abstract class AbstractBrower {
pageMap.put(popuHandle, popuPage);
//将当前页面指向到弹窗页面上
nowPage = popuPage;
windowHandleSet.add(popuHandle);
//返回切换弹窗成功
return true;

View File

@ -22,10 +22,9 @@ import pres.auxiliary.work.selenium.xml.ReadXml;
/**
* <p><b>文件名</b>AbstractElement.java</p>
* <p><b>用途</b></p>
* <p><pre>
* 对辅助化测试工具selenium的获取元素代码进行的二次封装通过类中提供的方法以及配合相应存储元素的
* <p>对辅助化测试工具selenium的获取元素代码进行的二次封装通过类中提供的方法以及配合相应存储元素的
* xml文件以更简便的方式对页面元素进行获取减少编程时的代码量
* </pre></p>
* </p>
* <p><b>编码时间</b>2020年4月25日 下午4:18:37</p>
* <p><b>修改时间</b>2020年4月25日 下午4:18:37</p>
* @author 彭宇琦
@ -34,7 +33,7 @@ import pres.auxiliary.work.selenium.xml.ReadXml;
*/
public abstract class AbstractBy {
/**
* 用于存储浏览器的WebDriver对象设为静态保证所有的子类只使用一个WebDriver对象以避免造成WebDriver不正确导致的Bug
* 用于存储浏览器的WebDriver对象
*/
WebDriver driver;
/**
@ -70,7 +69,7 @@ public abstract class AbstractBy {
private long waitTime = 5;
/**
* 控制是否自动切换窗体由于通过Event类调用时会构造另一个事件类但每个类都应共享一个开关故需要加上static
* 控制是否自动切换窗体由于通过Event类调用时会构造另一个事件类
*/
boolean isAutoSwitchIframe = true;
@ -109,9 +108,9 @@ public abstract class AbstractBy {
}
/**
* 用于设置事件等待时间默认时间为5秒
* 用于设置元素等待时间默认时间为5秒
*
* @param waitTime 事件等待时间
* @param waitTime 元素等待时间
*/
public void setWaitTime(long waitTime) {
this.waitTime = waitTime;

View File

@ -76,14 +76,6 @@ public class DataListBy extends ListBy {
super(driver);
}
/**
* 通过{@link AbstractBy}对象对类进行构造将传入的AbstractBy类中的关键参数设置到当前类对象中
* @param brower {@link AbstractBy}对象
*/
public DataListBy(AbstractBy by) {
super(by);
}
/**
* 用于设置首行元素是否为标题元素
* @param isFristRowTitle 首行是否为标题元素

View File

@ -45,14 +45,6 @@ public abstract class ListBy extends MultiBy {
super(driver);
}
/**
* 通过{@link AbstractBy}对象对类进行构造将传入的AbstractBy类中的关键参数设置到当前类对象中
* @param brower {@link AbstractBy}对象
*/
public ListBy(AbstractBy by) {
super(by);
}
/**
* 返回列表名称对应的元素个数若该列未被获取则返回-1
* @param name 被获取的列名称

View File

@ -39,14 +39,6 @@ public abstract class MultiBy extends AbstractBy {
super(driver);
}
/**
* 通过{@link AbstractBy}对象对类进行构造将传入的AbstractBy类中的关键参数设置到当前类对象中
* @param brower {@link AbstractBy}对象
*/
public MultiBy(AbstractBy by) {
super(by);
}
/**
* 用于根据传入的元素在xml文件中的名称或者元素的定位内容添加元素由于该方法不指定元素的定位
* 方式若传入的参数不是xml元素且非xpath路径或绝对css路径时其识别效率较慢建议在该情况下

View File

@ -90,14 +90,6 @@ public class SelectBy extends MultiBy {
super(driver);
}
/**
* 通过{@link AbstractBy}对象对类进行构造将传入的AbstractBy类中的关键参数设置到当前类对象中
* @param brower {@link AbstractBy}对象
*/
public SelectBy(AbstractBy by) {
super(by);
}
/**
* 设置首个选项是否为不可选择的选项
* @param fristIsEmpty 首个选项是否为不可选择

View File

@ -1,12 +1,16 @@
package pres.auxiliary.work.selenium.tool;
import java.io.File;
import java.util.ArrayList;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import pres.auxiliary.tool.date.Time;
import pres.auxiliary.tool.file.excel.AbstractWriteExcel;
import pres.auxiliary.work.selenium.brower.AbstractBrower;
import pres.auxiliary.work.testcase.file.MarkColorsType;
/**
* <p><b>文件名</b>ExcelRecord.java</p>
@ -21,30 +25,324 @@ import pres.auxiliary.work.selenium.brower.AbstractBrower;
*/
public class ExcelRecord extends AbstractWriteExcel<ExcelRecord> {
/**
* 存储浏览器对象
* 用于记录当前出现BUG的结果位置
*/
AbstractBrower brower;
private ArrayList<Integer> resultBugList = new ArrayList<>();
/**
* 用于指向当前记录的运行截图文件
*/
private File runScreenhotFile = null;
/**
* 用于指向当前记录的异常截图文件
*/
private File errorScreenhotFile = null;
/**
* 用于指向当前是否存在异常
*/
boolean isError = false;
/**
* 用于记录开始执行的时间
*/
private long startTime = 0L;
/**
* 通过
* @param configDocument
* @param tempFile
* @param brower
* 根据xml配置文件的{@link Document}类对象进行构造
* @param configDocument xml配置文件的{@link Document}类对象
* @param tempFile excel文件对象
*/
public ExcelRecord(Document configDocument, File tempFile, AbstractBrower brower) {
public ExcelRecord(Document configDocument, File tempFile) {
super(configDocument, tempFile);
this.brower = brower;
}
/**
* @param configFile
* @param tempFile
* @param brower
* @throws DocumentException
* 根据xml配置文件对象进行构造
* @param configFile xml配置文件对象
* @param tempFile excel文件对象
* @throws DocumentException 当读取xml配置文件对象失败时抛出的异常
*/
public ExcelRecord(File configFile, File tempFile, AbstractBrower brower) throws DocumentException {
public ExcelRecord(File configFile, File tempFile) throws DocumentException {
super(configFile, tempFile);
this.brower = brower;
}
/**
* 用于添加浏览器信息该方法不能单独调用必须配合其他
* 其他方法一起使用否则在生成文件时其写入的内容不会被填写到文件中
* @param brower 继承自{@link AbstractBrower}类的浏览器类对象
* @return 类本身
*/
public ExcelRecord setBrowerInformation(AbstractBrower brower) {
//TODO 添加浏览器信息内容
return this;
}
/**
* 用于添加执行者该方法不能单独调用必须配合的其他其他方法一起使用
* 否则在生成文件时其写入的内容不会被填写到文件中
* @param actionName 执行者
* @return 类本身
*/
public ExcelRecord setActionName(String actionName) {
switchSheet("运行记录").setFieldValue("active_person", actionName);
return this;
}
/**
* 用于添加运行类名以及运行方法名多次调用时会清空上一次记录的内容
* @param className 类名
* @param methodName 方法名
* @return 类本身
*/
public ExcelRecord runMethod(String className, String methodName) {
setFieldValue("运行记录", "class_name", className);
setFieldValue("运行记录", "method_name", methodName);
setFieldValue("错误记录", "class_name", className);
setFieldValue("错误记录", "method_name", methodName);
return this;
}
/**
* 用于记录执行开始时间记录结束时会写入相应的结束时间
*/
public ExcelRecord reckonByTime() {
//若设定当前状态为开始记录状态则存储当前的时间戳
startTime = System.currentTimeMillis();
return this;
}
/**
* 用于添加实际运行步骤支持传入多条每条数据将自动编号以及换行
*
* @param text 实际运行步骤
* @return 类本身
*/
public ExcelRecord runStep(String... text) {
return switchSheet("运行记录").addContent("step", text);
}
/**
* 用于添加执行结果根据传入的Bug判定来记录当前执行的Bug数量该方法可调用多次
* 将多个结果结果将自动编号
*
* @param text 结果
* @param bug 标记是否为Bug
* @return 类本身
*/
public ExcelRecord runResult(String text, boolean bug) {
//若当前结果为BUG则记录相应的编号
if (bug) {
//编号可根据相应sheet中字段的内容数量获取到当前出现BUG的内容位置
resultBugList.add(fieldMap.get("运行记录").get("result").content.size());
}
return switchSheet("运行记录").addContent("result", text);
}
/**
* 用于添加运行备注
*
* @param text 备注文本
* @return 类本身
*/
public ExcelRecord runMark(String text) {
return switchSheet("运行记录").addContent("mark", text);
}
/**
* 用于添加运行时截图
*
* @param screenshotFile 截图文件对象
* @return 类本身
*/
public ExcelRecord runScreenshot(File screenshotFile) {
//记录运行截图
runScreenhotFile = screenshotFile;
return switchSheet("运行记录")
.addContent("screenshot_position", screenshotFile.getPath());
}
/**
* 用于添加异常步骤的信息传入异常类后将会自动记录异常步骤
* @param exception 异常类
* @return 类本身
*/
public ExcelRecord exception(Exception exception) {
isError = true;
return switchSheet("错误记录")
.addContent("error_step", fieldMap.get("运行记录").get("step").content.size() == 0 ? "" : fieldMap.get("运行记录").get("step").getContent(-1))
.addContent("error_class", exception.getClass().getName())
.addContent("error_information", exception.getMessage());
}
/**
* 用于添加异常步骤信息并记录截图可参见{@link #exception(Exception)}
* @param exception 异常类
* @param screenshotFile 截图文件对象
* @return 类本身
*/
public ExcelRecord exception(Exception exception, File screenshotFile) {
errorScreenhotFile = screenshotFile;
return exception(exception)
.switchSheet("错误记录")
.addContent("screenshot_position", screenshotFile.getPath());
}
/**
* 用于添加测试用例的前置条件支持传入多条每条数据将自动编号以及换行
*
* @param text 前置条件
* @return 类本身
*/
public ExcelRecord caseCondition(String... text) {
return switchSheet("测试用例").addContent("condition", text);
}
/**
* 用于添加测试用例的标题不支持传入多个标题每次调用方法后将覆盖之前传入的内容
* @param text 标题
* @return 类本身
*/
public ExcelRecord caseTitle(String text) {
return switchSheet("测试用例")
.clearContent("title")
.addContent("title", text);
}
/**
* 用于添加测试用例的步骤支持传入多条每条数据将自动编号以及换行
* @param text 标题
* @return 类本身
*/
public ExcelRecord caseStep(String... text) {
return switchSheet("测试用例")
.addContent("step", text);
}
/**
* 用于添加测试用例的预期支持传入多条每条数据将自动编号以及换行
* @param text 标题
* @return 类本身
*/
public ExcelRecord caseExpect(String... text) {
return switchSheet("测试用例")
.addContent("expect", text);
}
@Override
public AbstractWriteExcel<ExcelRecord>.FieldMark end() {
//记录运行状态Bug数量当前时间以及运行时间
switchSheet("运行记录")
.addContent("state", isError ? "2" : "1")
.addContent("bug_number", String.valueOf(resultBugList.size()))
.addContent("active_time", new Time().getFormatTime())
.addContent("use_time", startTime == 0L ? "" : (String.valueOf((System.currentTimeMillis() - startTime) / 1000.0) + "s"));
//获取父类的end方法结束当前的记录
FieldMark fieldMark = super.end();
//判断是否存在BUG并标记相应的结果文本为红色
resultBugList.forEach(bugIndex -> {
fieldMark.changeTextColor("result", bugIndex, MarkColorsType.RED);
});
//若存在异常则将运行状态文本标记为红色并添加相应的超链接
if (isError) {
//修改文本为红色
fieldMark.changeTextColor("运行记录", "state", 0, MarkColorsType.RED);
//添加运行记录与错误记录的内链关系
fieldMark.fieldLink("运行记录", "state", getDocumentLinkPath("错误记录|id|-1"));
fieldMark.fieldLink("错误记录", "method_name", getDocumentLinkPath("运行记录|method_name|-1"));
//若存在异常截图文件则添加本地文件链接
if (errorScreenhotFile != null) {
fieldMark.fieldLink("错误记录", "screenshot_position", getScreenshotPath(errorScreenhotFile));
}
}
//若需要进行超链接则添加相应的超链接
if (runScreenhotFile != null) {
fieldMark.fieldLink("运行记录", "screenshot_position", getScreenshotPath(runScreenhotFile));
}
//获取测试用例中相应的元素
Element caseElement = fieldMark.getCaseElement("测试用例");
Element runElement = fieldMark.getCaseElement("运行记录");
//若能获取到元素则添加运行记录与测试用例之间的关联
if (caseElement != null && runElement != null) {
fieldMark.fieldLink("测试用例", "case_id", getDocumentLinkPath("运行记录|case_id|-1"));
fieldMark.fieldLink("运行记录", "case_id", getDocumentLinkPath("测试用例|case_id|-1"));
}
//初始化数据
initDta();
return fieldMark;
}
/**
* 用于初始化所有需要用作记录的数据
*/
private void initDta() {
resultBugList.clear();
runScreenhotFile = null;
errorScreenhotFile = null;
startTime = 0L;
isError = false;
}
/**
* 将xml文件中编写的文档内部超链接内容进行转换
* @param linkContent 链接内容
* @return 转换后的在poi使用的超链接代码
*/
private String getDocumentLinkPath(String linkContent) {
String[] linkContents = linkContent.split("\\|");
int length = linkContents.length;
//获取超链接的sheet名称
String linkSheetName = linkContents[0];
//根据sheet名称以及字段id获取该字段在sheet中的列数字下标并将数字下标转换为英文下标
String linkColumnIndex = num2CharIndex(getColumnNumIndex(linkSheetName, linkContents[1]));
String linkRowIndex = "";
//获取当前表格的最后一行元素个数
int lastIndex = ((Element) (contentXml.selectSingleNode("//sheet[@name='" + linkSheetName + "']"))).elements().size();
//判断当前linkContents是否存在链接行数即第三个元素且链接的文本为数字
//若符合规则则将linkRowIndex设置为当前编写的内容
//若不符合规则则将linkRowIndex设置为当前sheet的最后一行
//由于存在标题行调用getPoiIndex()方法得到的数值需要向下平移一位才能得到真实的数据
if (length > 2) {
linkRowIndex = String.valueOf(getPoiIndex(lastIndex + 1, Integer.valueOf(linkContents[2])) + 1);
} else {
linkRowIndex = String.valueOf(lastIndex + 1);
}
//返回文档链接的内容
return "'" + linkSheetName + "'!" + linkColumnIndex + linkRowIndex;
}
/**
* 用于返回需要链接的截图文件路径若截图文件在tempFile下则返回相应的相对路径
* 若不在其下则返回截图文件的绝对路径
* @param screenshotFile 截图文件对象
* @return 截图文件路径
*/
private String getScreenshotPath(File screenshotFile) {
//获取excel文件以及截图文件存储路径
String excelFolderPath = tempFile.getParentFile().getAbsolutePath();
String screenhotPath = screenshotFile.getAbsolutePath();
//判断当前截图文件的路径是否在excel文件路径下若存在其下则返回相应的相对路径
//若不存在则返回截图文件的绝对路径
if (screenhotPath.indexOf(excelFolderPath) == -1) {
return screenhotPath;
} else {
return "." + screenhotPath.substring(excelFolderPath.length()).replaceAll("\\\\", "/");
}
}
}

View File

@ -15,7 +15,7 @@ import java.util.Date;
* @version Ver1.0
* @since JDK 12
*/
public class Log {
public class Log_Old {
/**
* 用于存储文件的保存路径
*/
@ -45,7 +45,7 @@ public class Log {
* 默认位置为C:\\AutoTestting\\TestResults\\<br/>
* 默认文件名为不带后缀TestResults
*/
public Log() {
public Log_Old() {
}
/**
@ -59,7 +59,7 @@ public class Log {
* @throws IncorrectDirectoryException
* 传入路径不合法时抛出的异常
*/
public Log(String savePath) {
public Log_Old(String savePath) {
setSavePath(savePath);
}
@ -73,7 +73,7 @@ public class Log {
* @throws IncorrectDirectoryException
* 传入的路径不合法或者文件名不合法时抛出的异常
*/
public Log(String savePath, String fileName) {
public Log_Old(String savePath, String fileName) {
setSavePath(savePath);
setFileName(fileName);
}

View File

@ -66,7 +66,7 @@ public class RecordTool {
/**
* Log类对象默认构造
*/
private static Log log = new Log(DEFAULT_FILE_PATH);
private static Log_Old log = new Log_Old(DEFAULT_FILE_PATH);
/**
* Record类对象默认构造
*/
@ -127,11 +127,11 @@ public class RecordTool {
private static boolean startRecord = false;
/**
* 返回{@link Log}类对象
* 返回{@link Log_Old}类对象
*
* @return {@link Log}类对象
* @return {@link Log_Old}类对象
*/
public static Log getLog() {
public static Log_Old getLog() {
return log;
}

View File

@ -0,0 +1,32 @@
package pres.auxiliary.work.selenium.tool;
import java.io.File;
/**
* <p><b>文件名</b>RunLog.java</p>
* <p><b>用途</b>
* 以纯文本的形式记录自动化运行过程
* </p>
* <p><b>编码时间</b>2020年9月3日上午8:02:37</p>
* <p><b>修改时间</b>2020年9月3日上午8:02:37</p>
* @author 彭宇琦
* @version Ver1.0
*
*/
public class RunLog {
/**
* 指向日志文件类对象
*/
private File logFile = null;
public RunLog() {
}
/**
* 构造对象并指定日志存放位置
* @param logFile 日志文件类对象
*/
public RunLog(File logFile) {
this.logFile = logFile;
}
}

View File

@ -71,7 +71,7 @@ public abstract class AbstractTestCaseWrite<T extends AbstractTestCaseWrite<T>>
*/
public void relevanceCase(String field, String labelType) {
// 判断字段是否存在若不存在则抛出异常
if (!fieldMap.containsKey(field)) {
if (!fieldMap.get(nowSheetName).containsKey(field)) {
throw new LabelNotFoundException("当前sheet不存在的标签id" + field);
}

View File

@ -2,6 +2,8 @@ package pres.auxiliary.work.testcase.file;
import java.io.File;
import org.dom4j.DocumentException;
/**
* <p><b>文件名</b>BasicTestCaseWrite.java</p>
* <p><b>用途</b>在无相应的测试用例文件类时可使用本类对自定义的一个测试用例模板进行编辑</p>
@ -19,9 +21,10 @@ public class BasicTestCaseWrite extends AbstractTestCaseWrite<BasicTestCaseWrite
*
* @param configFile 测试文件模板xml配置文件类对象
* @param caseFile 测试用例文件类对象
* @throws DocumentException
* @throws IncorrectFileException 文件格式或路径不正确时抛出的异常
*/
public BasicTestCaseWrite(File configFile, File caseFile) {
public BasicTestCaseWrite(File configFile, File caseFile) throws DocumentException {
super(configFile, caseFile);
}
}

View File

@ -4,6 +4,8 @@ import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import org.dom4j.DocumentException;
/**
* <p><b>文件名</b>CommonTestCaseWrite.java</p>
* <p><b>用途</b>定义了测试用例中一些基本方法的添加如添加步骤预期方法等使编码时更加直观</p>
@ -21,9 +23,10 @@ public abstract class CommonTestCaseWrite<T extends CommonTestCaseWrite<T>> exte
*
* @param configFile 测试文件模板xml配置文件类对象
* @param caseFile 测试用例文件类对象
* @throws DocumentException
* @throws IncorrectFileException 文件格式或路径不正确时抛出的异常
*/
public CommonTestCaseWrite(File configFile, File caseFile) {
public CommonTestCaseWrite(File configFile, File caseFile) throws DocumentException {
super(configFile, caseFile);
}
@ -117,7 +120,7 @@ public abstract class CommonTestCaseWrite<T extends CommonTestCaseWrite<T>> exte
//1.命中一个结果则直接存入结果
//2.命中多个结果或未命中结果则以/key1/key2/key3/.../keyN的形式拼接字符串
//获取数据有效性
ArrayList<String> dataList = fieldMap.get(getModuleName()).matchDataValidation(keys);
ArrayList<String> dataList = fieldMap.get(nowSheetName).get(getModuleName()).matchDataValidation(keys);
//存储最终得到的模块信息
StringBuilder dataText = new StringBuilder();
if (dataList.size() == 1) {

View File

@ -2,6 +2,8 @@ package pres.auxiliary.work.testcase.file;
import java.io.File;
import org.dom4j.DocumentException;
import pres.auxiliary.work.testcase.templet.LabelType;
/**
@ -24,9 +26,10 @@ public class JiraTestCaseWrite extends CommonTestCaseWrite<JiraTestCaseWrite> {
*
* @param configFile 测试文件模板xml配置文件类对象
* @param caseFile 测试用例文件类对象
* @throws DocumentException
* @throws IncorrectFileException 文件格式或路径不正确时抛出的异常
*/
public JiraTestCaseWrite(File configFile, File caseFile) {
public JiraTestCaseWrite(File configFile, File caseFile) throws DocumentException {
super(configFile, caseFile);
//TODO 添加与测试用例模板的关联若测试用例模板字段有所改变则在此改变关联字段

View File

@ -27,16 +27,16 @@ public abstract class Case {
/**
* 用于标记获取标签下所有的文本
*/
final String ALL = "-1:getAllText";
protected final String ALL = "-1:getAllText";
/**
* 用于存储需要替换的词语的开始标记
*/
final String START_SIGN = "*{";
protected final String START_SIGN = "*{";
/**
* 用于存储需要替换的词语的结束标记
*/
final String END_SIGN = "}*";
protected final String END_SIGN = "}*";
/**
* 用于存储传入到正则表达式中的开始标记
@ -46,17 +46,17 @@ public abstract class Case {
/**
* 用于指向测试用例xml文件的Document对象
*/
Document configXml;
protected Document configXml;
/**
* 存储xml文件中其需要替换的词语
*/
HashMap<String, String> wordMap = new HashMap<String, String>(16);
protected HashMap<String, String> wordMap = new HashMap<String, String>(16);
/**
* 存储字段的文本内容
*/
HashMap<String, ArrayList<String>> fieldTextMap = new HashMap<String, ArrayList<String>>(16);
protected HashMap<String, ArrayList<String>> fieldTextMap = new HashMap<String, ArrayList<String>>(16);
/**
* 根据用例xml文件来构造Case类
@ -96,7 +96,7 @@ public abstract class Case {
* @param text 需要替换的文本
* @return 替换后的文本
*/
String replaceText(String text) {
protected String replaceText(String text) {
StringBuilder sb = new StringBuilder(text);
//存储替换符的位置
int index = 0;
@ -119,11 +119,24 @@ public abstract class Case {
/**
* 用于获取用例xml中对应用例的标签内的文本并返回替换词语后的文本
* @param caseName 用例名称
* @param label 标签枚举
* @param labelType 标签枚举{@link LabelType}
* @param id 对应标签的id属性
* @return 标签中存储的文本并进行处理
*/
String getLabelText(String caseName, LabelType label, String id) {
protected String getLabelText(String caseName, LabelType labelType, String id) {
//返回处理替换的单词后相应的文本
return getLabelText(caseName, labelType.getName(), id);
}
/**
* 用于获取用例xml中对应用例的标签内的文本并返回替换词语后的文本
* @param caseName 用例名称
* @param labelName 标签名称
* @param id 对应标签的id属性
* @return 标签中存储的文本并进行处理
*/
protected String getLabelText(String caseName, String labelName, String id) {
//定位case标签的名称属性名
String caseLabelNameAttribute = "name";
//定位标签中能指向调用用例的属性id
@ -134,7 +147,7 @@ public abstract class Case {
//拼接xpath规则"//case[@name='caseName']//标签名称[@id='id']"
String xpath = "//" + LabelType.CASE.getName() +
"[@" + caseLabelNameAttribute + "='" +
caseName + "']//" + label.getName() +
caseName + "']//" + labelName +
"[@" + labelIdAttribute + "='" + id +"']";
//获取相应的文本内容
@ -143,7 +156,7 @@ public abstract class Case {
//判断集合是否存在元素若不存在元素则抛出异常
if (textElement == null) {
throw new LabelNotFoundException("不存在的标签:<" + label.getName() + " " + labelIdAttribute + "='" + id +"'...>");
throw new LabelNotFoundException("不存在的标签:<" + labelName + " " + labelIdAttribute + "='" + id +"'...>");
}
//返回处理替换的单词后相应的文本
@ -158,7 +171,7 @@ public abstract class Case {
* @return 标签中存储的文本并进行处理
*/
@SuppressWarnings("unchecked")
ArrayList<String> getAllLabelText(String caseName, LabelType label) {
protected ArrayList<String> getAllLabelText(String caseName, LabelType label) {
//定位case标签的名称属性名
String caseLabelNameAttribute = "name";
//定位相应标签中存储用例内容的属性
@ -209,7 +222,7 @@ public abstract class Case {
* 用于保存xml文件中的字段
*/
@SuppressWarnings("unchecked")
void saveField() {
protected void saveField() {
//获取case标签下所有的标签存储至fieldTextMap以初始化所有的字段名称
((List<Element>) (configXml.getRootElement().elements("case"))).forEach(caseElement -> {
((List<Element>) caseElement.elements()).forEach(labelElement -> {
@ -225,23 +238,41 @@ public abstract class Case {
* @param label 标签名称枚举
* @param text 相应内容
*/
void addFieldText(LabelType label, String text) {
protected void addFieldText(LabelType label, String text) {
fieldTextMap.get(label.getName()).add(text);
}
/**
* 用于添加多行文本
* @param label 标签名称
* @param texts 相应内容
*/
protected void addFieldText(String labelName, List<String> texts) {
fieldTextMap.get(labelName).addAll(texts);
}
/**
* 用于添加一行文本
* @param label 标签名称
* @param text 相应内容
*/
protected void addFieldText(String labelName, String text) {
fieldTextMap.get(labelName).add(text);
}
/**
* 用于添加多行文本
* @param label 标签名称枚举
* @param texts 相应内容
*/
void addFieldText(LabelType label, List<String> texts) {
protected void addFieldText(LabelType label, List<String> texts) {
fieldTextMap.get(label.getName()).addAll(texts);
}
/**
* 用于清空字段的内容以避免存储上一次输入的用例
*/
void clearFieldText() {
protected void clearFieldText() {
fieldTextMap.forEach((key, value) -> {
fieldTextMap.get(key).clear();
});
@ -255,7 +286,7 @@ public abstract class Case {
return fieldTextMap;
}
/**`
/**
* 由于添加与参数相关的数据时需要将关联的字段如步骤及结果都添加至其中
* 若后期关联字段增加则代码量将是成倍的增加故将关联的内容提取出来
* 外部进行添加之后修改关联字段时只需修改该方法即可若传入-1则表示
@ -268,7 +299,7 @@ public abstract class Case {
* @param caseName 读取的用例名称
* @param ids id参数串
*/
void relevanceAddData(String caseName, String...ids) {
protected void relevanceAddData(String caseName, String...ids) {
//添加步骤
if (ids[0].equals(ALL)) {
addFieldText(LabelType.STEP, getAllLabelText(caseName, LabelType.STEP));

View File

@ -0,0 +1,47 @@
package pres.auxiliary.tool.file.excel;
import java.io.File;
import java.io.IOException;
import org.dom4j.DocumentException;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class WriteExcelTest {
final File configXml = new File("src/test/java/pres/auxiliary/tool/file/excel/WriteExcelTest.xml");
final File excelFile = new File("src/test/java/pres/auxiliary/tool/file/excel/WriteExcelTest.xlsx");
WriteExcel we;
@BeforeClass
public void init() throws DocumentException, IOException {
CreateExcelFile cef = new CreateExcelFile(configXml, excelFile);
cef.setCoverFile(true);
cef.create();
we = new WriteExcel(configXml, excelFile);
}
@AfterClass
public void writeFile() throws IOException {
we.writeFile();
java.awt.Desktop.getDesktop().open(excelFile.getParentFile());
}
@Test
public void mark_fieldLink() {
we.switchSheet("测试Sheet1")
.addContent("标题", "测试标题")
.addContent("状态", "1")
.switchSheet("测试Sheet2")
.addContent("关键用例", "2")
.addContent("设计者", "测试")
.switchSheet("测试Sheet1")
.addContent("步骤", "步骤1", "步骤2", "步骤3")
.end()
.fieldLink("标题", "'测试Sheet2'!A1")
.fieldLink("测试Sheet2", "设计者", "'测试Sheet1'!B2")
;
}
}

View File

@ -0,0 +1,24 @@
<?xml version='1.0' encoding='UTF-8'?>
<templet>
<sheet name='测试Sheet1' freeze='2'>
<column id='标题' name='Name' wide='30.88' align='left'/>
<column id='步骤' name='Test Script (Step-by-Step) - Step' wide='45.75' align='left' row_text='1' index='true'/>
<column id='状态' name='Status' wide='10.00' align='center'/>
<datas id='状态'>
<data name='Approved' />
<data name='Draft' />
<data name='Deprecated' />
</datas>
</sheet>
<sheet name='测试Sheet2' freeze='1'>
<column id='关键用例' name='Component' wide='10.00' align='center'/>
<column id='设计者' name='Owner' wide='10.00' align='center'/>
<datas id='关键用例'>
<data name='是' />
<data name='否' />
</datas>
</sheet>
</templet>

View File

@ -0,0 +1,140 @@
package pres.auxiliary.work.selenium.tool;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import org.dom4j.DocumentException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import pres.auxiliary.tool.file.excel.CreateExcelFile;
public class ExcelRecordTest {
CreateExcelFile cef;
ExcelRecord er;
final File configXml = new File("ConfigurationFiles/SeleniumConfigurationFile/LogConfiguration/ExcelRecordTemplet.xml");
final File tempFile = new File("src/test/java/pres/auxiliary/work/selenium/tool/Test.xlsx");
final File imageFile = new File("src/test/java/pres/auxiliary/work/selenium/tool/微信图片_20200828101657.png");
@BeforeTest
public void init() throws DocumentException, IOException {
cef = new CreateExcelFile(configXml, tempFile);
cef.setCoverFile(true);
cef.create();
er = new ExcelRecord(configXml, tempFile);
}
@AfterTest
public void writeFile() throws IOException {
er.writeFile();
Desktop.getDesktop().open(tempFile.getParentFile());
Desktop.getDesktop().open(er.getCaseXml());
}
@BeforeClass
public void recordBaseInfo() {
er.setActionName("yuqipeng_d");
}
@BeforeMethod
public void startRecord(Method method) {
er.runMethod(this.getClass().getName(), method.getName());
er.reckonByTime();
}
@AfterMethod
public void endRecord() {
er.end();
}
@Test
public void runStepTest() {
er.runStep("第一步", "第二步", "第三步");
}
@Test
public void runResultTest() {
er.runResult("结果1不是BUG", false);
er.runResult("结果2是BUG", true);
}
@Test
public void runMarkTest() {
er.runMark("这是备注信息");
}
@Test
public void runScreenshotTest() throws IOException {
er.runScreenshot(imageFile);
}
@Test
public void exceptionTest_NotFile() {
er.exception(new NullPointerException("抛出了NullPointerException异常"));
}
@Test
public void exceptionTest_HasFile() {
er.exception(new RecordStateException("抛出了RecordStateException异常"), imageFile);
}
@Test
public void caseConditionTest() {
er.caseCondition("测试用例前置条件1", "测试用例前置条件2");
}
@Test
public void caseTitleTest() {
er.caseTitle("测试用例标题");
}
@Test
public void caseStepTest() {
er.caseStep("测试用例步骤1", "测试用例步骤2");
}
@Test
public void caseExpectTest() {
er.caseExpect("测试用例预期1", "测试用例预期2");
}
@Test
public void addAllContentTest() {
er.caseTitle("测试成功运行标题")
.caseStep("测试第1步")
.caseExpect("测试第1预期")
.caseCondition("前置条件1")
.runStep("实际第1步")
.runStep("实际第2步")
.runStep("实际第3步", "实际第4步")
.runResult("实际结果1", false)
.runResult("实际结果2", true)
.runMark("实际备注")
.runScreenshot(imageFile)
.end();
er.reckonByTime()
.caseTitle("测试失败运行标题")
.caseStep("测试第1步")
.caseExpect("测试第1预期")
.caseCondition("前置条件1")
.runStep("实际第1步")
.runStep("实际第2步", "实际第3步")
.exception(new NullPointerException("此时抛出了NullPointerException异常"), imageFile)
.runStep("实际第4步")
.runStep("实际第5步")
.exception(new RecordStateException("这里出现了RecordStateException异常"))
.runResult("实际结果1", false)
.runResult("实际结果2", true)
.runMark("实际备注")
.runScreenshot(imageFile);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -73,9 +73,7 @@ public class BasicTestCaseWriteTest {
public void openFolder() throws IOException {
wtc.writeFile();
System.out.println("----------------------------");
// System.out.println("优先级:");
// Arrays.stream(wtc.getRank()).forEach(System.out::println);
// wtc.getCaseXml();
wtc.getCaseXml();
// java.awt.Desktop.getDesktop().open(wtc.getCaseXml());
java.awt.Desktop.getDesktop().open(tempFile.getParentFile());
java.awt.Desktop.getDesktop().open(tempFile);

View File

@ -56,7 +56,7 @@ public class JiraTestCaseWriteTest {
wtc.writeFile();
System.out.println("----------------------------");
java.awt.Desktop.getDesktop().open(tempFile.getParentFile());
java.awt.Desktop.getDesktop().open(tempFile);
// java.awt.Desktop.getDesktop().open(tempFile);
}
@BeforeMethod

View File

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="UTF-8"?>
<cases>
<sheet name="运行记录">
<case id="2c206a2f-2c1c-43e1-a633-374561096866">
<field id="active_person" name="执行者">
<text value="yuqipeng_d"/>
</field>
<field id="use_time" name="执行耗时">
<text value="0.01s"/>
</field>
<field id="version" name="版本">
<text value=""/>
</field>
<field id="result" name="执行结果">
<text value="1.实际结果1"/>
<text value="2.实际结果2" colors="10"/>
</field>
<field id="screenshot_position" name="截图位置" link="file=./微信图片_20200828101657.png">
<text value="src\test\java\pres\auxiliary\work\selenium\tool\微信图片_20200828101657.png"/>
</field>
<field id="active_time" name="执行时间">
<text value="2020-08-31 12:50:19"/>
</field>
<field id="brower" name="浏览器">
<text value=""/>
</field>
<field id="bug_number" name="Bug数量">
<text value="1"/>
</field>
<field id="system" name="操作系统">
<text value=""/>
</field>
<field id="method_name" name="方法名">
<text value="addAllContentTest"/>
</field>
<field id="case_id" name="用例编号" link="dom='测试用例'!A2">
<text value=""/>
</field>
<field id="step" name="执行步骤">
<text value="1.实际第1步"/>
<text value="2.实际第2步"/>
<text value="3.实际第3步"/>
<text value="4.实际第4步"/>
</field>
<field id="id" name="序号">
<text value=""/>
</field>
<field id="state" name="执行状态">
<text value="正常"/>
</field>
<field id="class_name" name="类名">
<text value="pres.auxiliary.work.selenium.tool.ExcelRecordTest"/>
</field>
<field id="mark" name="备注">
<text value="实际备注"/>
</field>
</case>
<case id="1ce766aa-f62c-4df3-bc09-80e63ab67a41">
<field id="active_person" name="执行者">
<text value="yuqipeng_d"/>
</field>
<field id="use_time" name="执行耗时">
<text value="0.004s"/>
</field>
<field id="version" name="版本">
<text value=""/>
</field>
<field id="result" name="执行结果">
<text value="1.实际结果1"/>
<text value="2.实际结果2" colors="10"/>
</field>
<field id="screenshot_position" name="截图位置" link="file=./微信图片_20200828101657.png">
<text value="src\test\java\pres\auxiliary\work\selenium\tool\微信图片_20200828101657.png"/>
</field>
<field id="active_time" name="执行时间">
<text value="2020-08-31 12:50:19"/>
</field>
<field id="brower" name="浏览器">
<text value=""/>
</field>
<field id="bug_number" name="Bug数量">
<text value="1"/>
</field>
<field id="system" name="操作系统">
<text value=""/>
</field>
<field id="method_name" name="方法名">
<text value="addAllContentTest"/>
</field>
<field id="case_id" name="用例编号" link="dom='测试用例'!A3">
<text value=""/>
</field>
<field id="step" name="执行步骤">
<text value="1.实际第1步"/>
<text value="2.实际第2步"/>
<text value="3.实际第3步"/>
<text value="4.实际第4步"/>
<text value="5.实际第5步"/>
</field>
<field id="id" name="序号">
<text value=""/>
</field>
<field id="state" name="执行状态" link="dom='错误记录'!A2">
<text value="异常" colors="10"/>
</field>
<field id="class_name" name="类名">
<text value="pres.auxiliary.work.selenium.tool.ExcelRecordTest"/>
</field>
<field id="mark" name="备注">
<text value="实际备注"/>
</field>
</case>
</sheet>
<sheet name="测试用例">
<case id="2c206a2f-2c1c-43e1-a633-374561096866">
<field id="expect" name="预期">
<text value="测试第1预期"/>
</field>
<field id="condition" name="前置条件">
<text value="1.前置条件1"/>
</field>
<field id="case_id" name="用例编号" link="dom='运行记录'!B2">
<text value=""/>
</field>
<field id="step" name="步骤">
<text value="测试第1步"/>
</field>
<field id="title" name="用例标题">
<text value="测试成功运行标题"/>
</field>
</case>
<case id="1ce766aa-f62c-4df3-bc09-80e63ab67a41">
<field id="expect" name="预期">
<text value="测试第1预期"/>
</field>
<field id="condition" name="前置条件">
<text value="1.前置条件1"/>
</field>
<field id="case_id" name="用例编号" link="dom='运行记录'!B3">
<text value=""/>
</field>
<field id="step" name="步骤">
<text value="测试第1步"/>
</field>
<field id="title" name="用例标题">
<text value="测试失败运行标题"/>
</field>
</case>
</sheet>
<sheet name="错误记录">
<case id="1ce766aa-f62c-4df3-bc09-80e63ab67a41">
<field id="screenshot_position" name="截图位置" link="file=./微信图片_20200828101657.png">
<text value="1.src\test\java\pres\auxiliary\work\selenium\tool\微信图片_20200828101657.png"/>
</field>
<field id="error_information" name="异常信息">
<text value="1.此时抛出了NullPointerException异常"/>
<text value="2.这里出现了RecordStateException异常"/>
</field>
<field id="error_class" name="异常类">
<text value="1.java.lang.NullPointerException"/>
<text value="2.pres.auxiliary.work.selenium.tool.RecordStateException"/>
</field>
<field id="method_name" name="方法名" link="dom='运行记录'!D3">
<text value="addAllContentTest"/>
</field>
<field id="error_step" name="错误步骤">
<text value="1.实际第3步"/>
<text value="2.实际第5步"/>
</field>
<field id="id" name="序号">
<text value=""/>
</field>
<field id="class_name" name="类名">
<text value="pres.auxiliary.work.selenium.tool.ExcelRecordTest"/>
</field>
</case>
</sheet>
</cases>

View File

@ -1,97 +0,0 @@
package pres.readme.code;
import java.io.File;
import pres.auxiliary.work.testcase.templet.Case;
import pres.auxiliary.work.testcase.templet.LabelType;
public class MyCase extends Case {
public MyCase(File configXmlFile) {
super(configXmlFile);
}
/**
* 用于生成app上浏览列表的测试用例
* @return 类本身
*/
public Case myCase1() {
//清空字段的内容
clearFieldText();
// 存储case标签的name属性内容
String caseName = "myTest001";
//存储标题信息
addFieldText(LabelType.TITLE, getLabelText(caseName, LabelType.TITLE, "1"));
//添加步骤与预期
relevanceAddData(caseName, ALL, ALL);
//存储前置条件信息
addFieldText(LabelType.PRECONDITION, getAllLabelText(caseName, LabelType.PRECONDITION));
//存储关键词信息
addFieldText(LabelType.KEY, getLabelText(caseName, LabelType.KEY, "1"));
//存储优先级信息
addFieldText(LabelType.RANK, getLabelText(caseName, LabelType.RANK, "1"));
return this;
}
/**
* 用于生成web上列表的测试用例
* @return 类本身
*/
public Case myCase2(String word) {
//清空字段的内容
clearFieldText();
// 存储case标签的name属性内容
String caseName = "myTest002";
wordMap.put("词语", word);
//存储标题信息
addFieldText(LabelType.TITLE, getLabelText(caseName, LabelType.TITLE, "1"));
//添加步骤与预期
relevanceAddData(caseName, ALL, ALL);
//存储前置条件信息
addFieldText(LabelType.PRECONDITION, getAllLabelText(caseName, LabelType.PRECONDITION));
//存储关键词信息
addFieldText(LabelType.KEY, getLabelText(caseName, LabelType.KEY, "1"));
//存储优先级信息
addFieldText(LabelType.RANK, getLabelText(caseName, LabelType.RANK, "1"));
return this;
}
/**
* 用于生成web上列表的测试用例
* @return 类本身
*/
public Case myCase3() {
//清空字段的内容
clearFieldText();
// 存储case标签的name属性内容
String caseName = "myTest001";
//添加替换词语
wordMap.put("条件", "混合");
//存储标题信息
addFieldText(LabelType.TITLE, getLabelText(caseName, LabelType.TITLE, "1"));
//添加步骤与预期
relevanceAddData(caseName, ALL, ALL);
//存储前置条件信息
addFieldText(LabelType.PRECONDITION, getAllLabelText(caseName, LabelType.PRECONDITION));
//存储关键词信息
addFieldText(LabelType.KEY, getLabelText(caseName, LabelType.KEY, "1"));
//存储优先级信息
addFieldText(LabelType.RANK, getLabelText(caseName, LabelType.RANK, "1"));
return this;
}
}

View File

@ -0,0 +1,50 @@
<?xml version='1.0' encoding='UTF-8'?>
<cases>
<case name='myTest001'>
<steps>
<step id='1' value='myTest001_步骤1'/>
<step id='2' value='myTest001_步骤2'/>
</steps>
<excepts>
<except id='1' value='myTest001_预期1'/>
<except id='2' value='myTest001_预期2'/>
</excepts>
<titles>
<title id='1' value='myTest001_标题1*{条件}*' />
</titles>
<preconditions>
<precondition id='1' value='myTest001_前置1' />
<precondition id='2' value='myTest001_前置2' />
</preconditions>
<ranks>
<rank id='1' value='myTest001_优先级1' />
</ranks>
<keys>
<key id='1' value='myTest001_关键词1' />
</keys>
</case>
<case name='myTest002'>
<steps>
<step id='1' value='myTest002_步骤1_*{词语}*'/>
<step id='2' value='myTest002_步骤2'/>
<step id='3' value='myTest002_步骤3'/>
</steps>
<excepts>
<except id='1' value='myTest002_预期1'/>
</excepts>
<titles>
<title id='1' value='myTest002_标题1' />
</titles>
<preconditions>
<precondition id='1' value='myTest002_前置1' />
<precondition id='2' value='myTest002_前置2' />
</preconditions>
<ranks>
<rank id='1' value='myTest002_优先级1' />
</ranks>
<keys>
<key id='1' value='myTest002_关键词1' />
</keys>
</case>
</cases>

View File

@ -10,7 +10,6 @@ import org.testng.annotations.Test;
import pres.auxiliary.tool.file.excel.CreateExcelFile;
import pres.auxiliary.work.testcase.file.BasicTestCaseWrite;
import pres.auxiliary.work.testcase.file.JiraTestCaseWrite.JiraFieldIdType;
import pres.auxiliary.work.testcase.templet.InformationCase;
import pres.auxiliary.work.testcase.templet.LabelType;
@ -71,6 +70,7 @@ public class TestWriteCase {
@AfterClass
public void openFolder() throws IOException {
java.awt.Desktop.getDesktop().open(wtc.getCaseXml());
//将测试用例内容写入到文件中
wtc.writeFile();
}
@ -79,5 +79,16 @@ public class TestWriteCase {
public void addCase() {
wtc.addCase(ic.addBasicTextboxCase("姓名", false, true, false)).end();
wtc.addCase(ic.addIdCardCase("身份证", true, false, false)).end();
wtc.setFieldValue("模块", "/测试项目/账号管理/创建账号2");
wtc.addCase(ic.addIdCardCase("护照号", true, false, false)).end();
}
@Test
public void myCaseTest() {
MyCase mc = new MyCase(new File("src/test/java/pres/readme/code/MyCase.xml"));
wtc.addCase(mc.myCase1()).end();
wtc.addCase(mc.myCase2("测试")).end();
wtc.addCase(mc.myCase3()).end();
}
}

View File

@ -1,10 +1,10 @@
package test.javase;
import pres.auxiliary.work.selenium.tool.Log;
import pres.auxiliary.work.selenium.tool.Log_Old;
public class testResultFile {
public static void main(String[] args) {
Log trf = new Log();
Log_Old trf = new Log_Old();
trf.setSavePath("\\a");
}