Merge branch 'master' of https://github.com/pyqone/autest.git
Conflicts: src/test/java/pres/readme/code/MyCase.java
This commit is contained in:
commit
2caa9b12af
|
@ -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>
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -371,6 +371,7 @@ public abstract class AbstractBrower {
|
|||
pageMap.put(popuHandle, popuPage);
|
||||
//将当前页面指向到弹窗页面上
|
||||
nowPage = popuPage;
|
||||
windowHandleSet.add(popuHandle);
|
||||
|
||||
//返回切换弹窗成功
|
||||
return true;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 首行是否为标题元素
|
||||
|
|
|
@ -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 被获取的列名称
|
||||
|
|
|
@ -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路径时,其识别效率较慢,建议在该情况下
|
||||
|
|
|
@ -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 首个选项是否为不可选择
|
||||
|
|
|
@ -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("\\\\", "/");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 添加与测试用例模板的关联,若测试用例模板字段有所改变,则在此改变关联字段
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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")
|
||||
;
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -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>
|
|
@ -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.
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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>
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue