From f54fdad7fec1027453c3bf0d6cce3eb72bd5d307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E5=AE=87=E7=90=A6?= <465615774@qq.com> Date: Thu, 26 Mar 2020 20:26:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=95=B0=E6=8D=AE=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E7=B1=BB=E7=9B=B8=E5=85=B3=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=EF=BC=8C=E5=B9=B6=E6=B7=BB=E5=8A=A0=E7=9B=B8=E5=BA=94?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=9B=B8=E5=BA=94=E7=9A=84xml=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CaseTemplet/BrowseList.xml | 300 ++++++++++++------ .../work/n/{tcase => testcase}/Case.java | 6 +- .../CaseContentException.java | 2 +- .../n/{tcase => testcase}/DataListCase.java | 214 ++++++++++++- .../work/n/{tcase => testcase}/FieldType.java | 2 +- .../IncorrectFileException.java | 2 +- .../{tcase => testcase}/InformationCase.java | 2 +- .../LabelNotFoundException.java | 2 +- .../work/n/{tcase => testcase}/LabelType.java | 2 +- .../n/{tcase => testcase}/MarkColorsType.java | 2 +- .../{tcase => testcase}/TestCaseTemplet.java | 2 +- .../n/{tcase => testcase}/TestCaseWrite.java | 2 +- .../work/testcase/DataListCaseTest.java | 185 +++++++++++ .../work/testcase/InformationCaseTest.java | 28 +- .../testcase/ProgramWriteTestCaseDemo.java | 12 +- .../work/testcase/TestCaseTempletTest.java | 4 +- .../work/testcase/WriteTestCaseTest.java | 16 +- .../auxiliary/work/testcase/测试用例.xlsx | Bin 9727 -> 8719 bytes 18 files changed, 631 insertions(+), 152 deletions(-) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/Case.java (96%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/CaseContentException.java (92%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/DataListCase.java (58%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/FieldType.java (92%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/IncorrectFileException.java (91%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/InformationCase.java (97%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/LabelNotFoundException.java (89%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/LabelType.java (90%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/MarkColorsType.java (91%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/TestCaseTemplet.java (96%) rename src/main/java/pres/auxiliary/work/n/{tcase => testcase}/TestCaseWrite.java (97%) create mode 100644 src/test/java/pres/auxiliary/work/testcase/DataListCaseTest.java diff --git a/ConfigurationFiles/CaseConfigurationFile/CaseTemplet/BrowseList.xml b/ConfigurationFiles/CaseConfigurationFile/CaseTemplet/BrowseList.xml index 78ea941..274acde 100644 --- a/ConfigurationFiles/CaseConfigurationFile/CaseTemplet/BrowseList.xml +++ b/ConfigurationFiles/CaseConfigurationFile/CaseTemplet/BrowseList.xml @@ -1,11 +1,17 @@ - - <keyword value='*{信息}*列表,刷新,加载' /> - <rank value='1' /> + <titles> + <title id='1' value='浏览*{信息}*列表' /> + </titles> + <keys> + <key id='1' value='*{信息}*列表,刷新,加载' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> - <precondition value='列表中有信息存在' /> + <precondition id='1' value='列表中有信息存在' /> </preconditions> <steps> <step id='1' value='查看*{信息}*列表' /> @@ -14,21 +20,27 @@ <step id='4' value='在无剩余数据时,上拉加载列表' /> <step id='5' value='加载或刷新列表时点击某一个信息或某一个按钮' /> </steps> - <expectations> - <expectation id='1' value='能看到当前存在的所有信息,且信息按一定规则排序'/> - <expectation id='2' value='列表被刷新,若有新增信息则被显示出来,且原有数据排序不会混乱'/> - <expectation id='3' value='能加载剩下的信息'/> - <expectation id='4' value='上拉有效,但不加载出数据或数据不会错乱'/> - <expectation id='5' value='app不会闪退,且能正常显示'/> - </expectations> + <excepts> + <except id='1' value='能看到当前存在的所有信息,且信息按一定规则排序'/> + <except id='2' value='列表被刷新,若有新增信息则被显示出来,且原有数据排序不会混乱'/> + <except id='3' value='能加载剩下的信息'/> + <except id='4' value='上拉有效,但不加载出数据或数据不会错乱'/> + <except id='5' value='app不会闪退,且能正常显示'/> + </excepts> </case> <case name='addWebBrowseListCase'> - <title value='浏览*{信息}*列表' /> - <keyword value='*{信息}*列表,刷新,加载' /> - <rank value='1' /> + <titles> + <title id='1' value='浏览*{信息}*列表' /> + </titles> + <keys> + <key id='1' value='*{信息}*列表,刷新,加载' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> - <precondition value='列表中有信息存在' /> + <precondition id='1' value='列表中有信息存在' /> </preconditions> <steps> <step id='1' value='查看*{信息}*列表' /> @@ -38,66 +50,86 @@ <step id='5' value='在尾页上点击“尾页”按钮' /> <step id='6' value='在尾页上点击“下一页”按钮' /> </steps> - <expectations> - <expectation id='1' value='能看到当前存在的所有信息,且信息按一定规则排序'/> - <expectation id='2' value='能看到不同页上的列表信息,且切换页后列表的排序不变'/> - <expectation id='3' value='按钮无法点击或点击无效,且当前页列表排序不变'/> - <expectation id='4' value='按钮无法点击或点击无效,且当前页列表排序不变'/> - <expectation id='5' value='按钮无法点击或点击无效,且当前页列表排序不变'/> - <expectation id='6' value='按钮无法点击或点击无效,且当前页列表排序不变'/> - </expectations> + <excepts> + <except id='1' value='能看到当前存在的所有信息,且信息按一定规则排序'/> + <except id='2' value='能看到不同页上的列表信息,且切换页后列表的排序不变'/> + <except id='3' value='按钮无法点击或点击无效,且当前页列表排序不变'/> + <except id='4' value='按钮无法点击或点击无效,且当前页列表排序不变'/> + <except id='5' value='按钮无法点击或点击无效,且当前页列表排序不变'/> + <except id='6' value='按钮无法点击或点击无效,且当前页列表排序不变'/> + </excepts> </case> <case name='addInputSearchCase'> - <title value='通过*{搜索条件}*对*{信息}*进行搜索' /> - <keyword value='*{信息}*列表,搜索' /> - <rank value='1' /> + <titles> + <title id='1' value='通过*{搜索条件}*对*{信息}*进行搜索' /> + </titles> + <keys> + <key id='1' value='*{信息}*列表,搜索' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> - <precondition value='列表中有信息存在' /> + <precondition id='1' value='列表中有信息存在' /> </preconditions> <steps> <step id='1' value='通过*{搜索条件}*对*{信息}*进行模糊搜索' /> <step id='2' value='通过*{搜索条件}*对*{信息}*进行精准搜索' /> <step id='3' value='不输入信息进行搜索' /> <step id='4' value='输入*{信息}*中都不包含的关键词进行搜索' /> + <step id='5' value='输入“*”符号等特殊字符进行搜索' /> </steps> - <expectations> - <expectation id='1' value='能搜索出包含输入内容的结果'/> - <expectation id='2' value='能搜索出与输入相对应的结果'/> - <expectation id='3' value='能查看到所有的结果'/> - <expectation id='4' value='无搜索结果'/> - </expectations> + <excepts> + <except id='1' value='能搜索出包含输入内容的结果'/> + <except id='2' value='能搜索出与输入相对应的结果'/> + <except id='3' value='能查看到所有的结果'/> + <except id='4' value='无搜索结果'/> + <except id='5' value='只能搜索出包含特殊字符的结果'/> + </excepts> </case> <case name='addSelectSearchCase'> - <title value='通过*{搜索条件}*对*{信息}*进行搜索' /> - <keyword value='*{信息}*列表,搜索' /> - <rank value='1' /> + <titles> + <title id='1' value='通过*{搜索条件}*对*{信息}*进行搜索' /> + </titles> + <keys> + <key id='1' value='*{信息}*列表,搜索' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> - <precondition value='列表中有信息存在' /> + <precondition id='1' value='列表中有信息存在' /> </preconditions> <steps> - <step id='1' value='选择*{搜索条件}*的第一个选项对*{信息}*进行搜索' /> + <step id='1' value='选择*{搜索条件}*的第一个有效选项对*{信息}*进行搜索' /> <step id='2' value='选择*{搜索条件}*非第一个选项和非最后一个选项对*{信息}*进行搜索' /> <step id='3' value='选择*{搜索条件}*的最后一个选项对*{信息}*进行搜索' /> <step id='4' value='不选择任何选项进行搜索' /> <step id='5' value='选择所有*{信息}*中都不包含的选项进行搜索' /> </steps> - <expectations> - <expectation id='1' value='能搜索出符合选项的结果'/> - <expectation id='2' value='能搜索出符合选项的结果'/> - <expectation id='3' value='能搜索出符合选项的结果'/> - <expectation id='4' value='能查看到所有的结果'/> - <expectation id='5' value='无搜索结果'/> - </expectations> + <excepts> + <except id='1' value='能搜索出符合选项的结果'/> + <except id='2' value='*{下级选项}*内容置空,其中的选项随之改变,且能搜索出所有符合*{搜索条件}*选中的选项结果,以及符合*{下级选项}*所有选项的结果'/> + <except id='3' value='*{下级选项}*内容置空,其中的选项也置空,且能搜索出符合*{搜索条件}*所有选项的结果'/> + <except id='4' value='能查看到所有的结果,或者默认选项相应的结果'/> + <except id='5' value='无搜索结果'/> + </excepts> </case> <case name='addDateSearchCase'> - <title value='通过*{搜索条件}*对*{信息}*进行搜索' /> - <keyword value='*{信息}*列表,搜索' /> - <rank value='1' /> + <titles> + <title id='1' value='通过*{搜索条件}*对*{信息}*进行搜索' /> + </titles> + <keys> + <key id='1' value='*{信息}*列表,搜索' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> - <precondition value='列表中有信息存在' /> + <precondition id='1' value='列表中有信息存在' /> </preconditions> <steps> <step id='1' value='选择一个列表中存在的*{搜索条件}*数据进行搜索' /> @@ -110,42 +142,54 @@ <step id='8' value='选择一个在*{开始时间}*至*{结束时间}*不存在数据的时间段进行搜索' /> <step id='9' value='不选择*{开始时间}*与*{结束时间}*进行搜索' /> </steps> - <expectations> - <expectation id='1' value='能搜索出在该*{搜索条件}*内所有的结果'/> - <expectation id='2' value='搜索无结果'/> - <expectation id='3' value='能搜索出所有的结果'/> - <expectation id='4' value='无搜索结果或弹出错误输入的提示'/> - <expectation id='5' value='能搜索出从有数据以来至*{结束时间}*的所有结果'/> - <expectation id='6' value='能搜索出从*{开始时间}*至今的所有结果'/> - <expectation id='7' value='能搜索出从*{开始时间}*至*{结束时间}*的所有结果且时间边界上的数据也能展示'/> - </expectations> + <excepts> + <except id='1' value='能搜索出在该*{搜索条件}*内所有的结果'/> + <except id='2' value='搜索无结果'/> + <except id='3' value='能搜索出所有的结果'/> + <except id='4' value='无搜索结果或弹出错误输入的提示'/> + <except id='5' value='能搜索出从有数据以来至*{结束时间}*的所有结果'/> + <except id='6' value='能搜索出从*{开始时间}*至今的所有结果'/> + <except id='7' value='能搜索出从*{开始时间}*至*{结束时间}*的所有结果且时间边界上的数据也能展示'/> + </excepts> </case> <case name='addListSortCase'> - <title value='对*{信息}*列表按照*{搜索条件}*进行排序' /> - <keyword value='*{信息}*列表,排序' /> - <rank value='1' /> + <titles> + <title id='1' value='对*{信息}*列表按照*{搜索条件}*进行排序' /> + </titles> + <keys> + <key id='1' value='*{信息}*列表,排序' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> - <precondition value='列表中有信息存在' /> + <precondition id='1' value='列表中有信息存在' /> </preconditions> <steps> <step id='1' value='点击列表中的*{搜索条件}*列' /> <step id='2' value='再次点击列表中的*{搜索条件}*列' /> <step id='3' value='当*{搜索条件}*列为空时,对该列排序' /> </steps> - <expectations> - <expectation id='1' value='列表中的数据按照所选的项目进行某种规律的排序'/> - <expectation id='2' value='列表中的数据按照第一步相反的顺序排序'/> - <expectation id='3' value='列表中的数据排序不变'/> - </expectations> + <excepts> + <except id='1' value='列表中的数据按照所选的项目进行某种规律的排序'/> + <except id='2' value='列表中的数据按照第一步相反的顺序排序'/> + <except id='3' value='列表中的数据排序不变'/> + </excepts> </case> <case name='addExportListCase'> - <title value='导出*{信息}*列表的数据' /> - <keyword value='*{信息}*列表,导出' /> - <rank value='1' /> + <titles> + <title id='1' value='导出*{信息}*列表的数据' /> + </titles> + <keys> + <key id='1' value='*{信息}*列表,导出' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> - <precondition value='列表中有信息存在' /> + <precondition id='1' value='列表中有信息存在' /> </preconditions> <steps> <step id='1' value='在列表上有数据的情况下点击“*{导出按钮}*”按钮' /> @@ -155,18 +199,24 @@ <step id='5' value='在列表上无数据的情况下点击“*{导出按钮}*”按钮' /> <step id='6' value='对列表搜索后点击“*{导出按钮}*”按钮' /> </steps> - <expectations> - <expectation id='1' value='能导出文件,且文件上显示的信息与列表上所有的信息保持一致'/> - <expectation id='2' value='能导出文件,导出的文件中只有勾选的*{信息}*数据且文件上显示的信息与列表上的信息保持一致'/> - <expectation id='4' value='导出的文件中有所有的*{信息}*信息且文件上显示的信息与列表上的信息保持一致'/> - <expectation id='5' value='若能导出相应的文件,则文件中只有表格的表头,无其他数据;若不能导出,则给出相应的提示'/> - </expectations> + <excepts> + <except id='1' value='能导出文件,且文件上显示的信息与列表上所有的信息保持一致'/> + <except id='2' value='能导出文件,导出的文件中只有勾选的*{信息}*数据且文件上显示的信息与列表上的信息保持一致'/> + <except id='4' value='导出的文件中有所有的*{信息}*信息且文件上显示的信息与列表上的信息保持一致'/> + <except id='5' value='若能导出相应的文件,则文件中只有表格的表头,无其他数据;若不能导出,则给出相应的提示'/> + </excepts> </case> <case name='addImportListCase'> - <title value='导入*{信息}*列表的数据' /> - <keyword value='*{信息}*列表,导入' /> - <rank value='1' /> + <titles> + <title id='1' value='导入*{信息}*列表的数据' /> + </titles> + <keys> + <key id='1' value='*{信息}*列表,导入' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> </preconditions> <steps> @@ -174,34 +224,46 @@ <step id='2' value='在模版中部分必填信息不输入或信息错误输入,导入' /> <step id='3' value='导入非模版文件' /> </steps> - <expectations> - <expectation id='1' value='信息导入成功,能在列表上看到新导入的帐号信息'/> - <expectation id='2' value='信息导入失败,并给出相应的提示'/> - <expectation id='3' value='信息导入失败,并给出相应的提示'/> - </expectations> + <excepts> + <except id='1' value='信息导入成功,能在列表上看到新导入的帐号信息'/> + <except id='2' value='信息导入失败,并给出相应的提示'/> + <except id='3' value='信息导入失败,并给出相应的提示'/> + </excepts> </case> <case name='addResetSearchCase'> - <title value='重置搜索' /> - <keyword value='重置,搜索' /> - <rank value='1' /> + <titles> + <title id='1' value='重置搜索' /> + </titles> + <keys> + <key id='1' value='重置,搜索' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> - <precondition value='已对列表进行搜索' /> + <precondition id='1' value='已对列表进行搜索' /> </preconditions> <steps> <step id='1' value='先对列表进行一次搜索,之后点击重置按钮' /> </steps> - <expectations> - <expectation id='1' value='所有的搜索条件回到初次进入界面的状态,且列表中的数据也被还原'/> - </expectations> + <excepts> + <except id='1' value='所有的搜索条件回到初次进入界面的状态,且列表中的数据也被还原'/> + </excepts> </case> <case name='addSwitchListShowDataCase'> - <title value='修改列表每页显示的数据量' /> - <keyword value='切换,数据量' /> - <rank value='1' /> + <titles> + <title id='1' value='修改列表每页显示的数据量' /> + </titles> + <keys> + <key id='1' value='切换,数据量' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> <preconditions> - <precondition value='列表中有多条数据存在,且能分页显示' /> + <precondition id='1' value='列表中有多条数据存在,且能分页显示' /> </preconditions> <steps> <step id='1' value='选择分页下拉框的第一个选项' /> @@ -210,12 +272,44 @@ <step id='4' value='在数据量较少的情况下选择一个较大的单页显示量(如只有5条数据时选择单页显示20条数据)' /> <step id='5' value='在列表无数据的情况下切换单页数据显示量' /> </steps> - <expectations> - <expectation id='1' value='列表中每页显示相应的数据量,且修改后不改变原数据的顺序'/> - <expectation id='2' value='列表中每页显示相应的数据量,且修改后不改变原数据的顺序'/> - <expectation id='3' value='列表中每页显示相应的数据量,且修改后不改变原数据的顺序'/> - <expectation id='4' value='列表中数据无变化,且顺序保持不变'/> - <expectation id='5' value='列表无任何变化'/> - </expectations> + <excepts> + <except id='1' value='列表中每页显示相应的数据量,且修改后不改变原数据的顺序'/> + <except id='2' value='列表中每页显示相应的数据量,且修改后不改变原数据的顺序'/> + <except id='3' value='列表中每页显示相应的数据量,且修改后不改变原数据的顺序'/> + <except id='4' value='列表中数据无变化,且顺序保持不变'/> + <except id='5' value='列表无任何变化'/> + </excepts> + </case> + + <case name='delectDataCase'> + <titles> + <title id='1' value='删除*{信息}*列表的数据' /> + </titles> + <keys> + <key id='1' value='*{信息}*列表,删除' /> + </keys> + <ranks> + <rank id='1' value='1' /> + </ranks> + <preconditions> + <precondition id='1' value='列表中有信息存在' /> + </preconditions> + <steps> + <step id='1' value='不选择数据,点击“*{删除按钮}*”按钮' /> + <step id='2' value='选择第一条数据,点击“*{删除按钮}*”按钮' /> + <step id='3' value='选择最后一条数据,点击“*{删除按钮}*”按钮' /> + <step id='4' value='选择多条数据,点击“*{删除按钮}*”按钮' /> + <step id='5' value='选择一页数据,点击“*{删除按钮}*”按钮' /> + <step id='6' value='在只有一页数据的情况下,全选,点击“*{删除按钮}*”按钮' /> + <step id='7' value='列表搜索后勾选部分数据,点击“*{删除按钮}*”按钮' /> + <step id='8' value='列表搜索后数据全选,点击“*{删除按钮}*”按钮' /> + </steps> + <excepts> + <except id='1' value='无法删除数据,并给出相应选择数据的提示'/> + <except id='2' value='数据被删除,列表不再显示被删除的数据,其后的数据顶替被删除的数据的位置,且数据列表排序不变,数据总条数减少'/> + <except id='3' value='一页数据数据被删除,其下一页的数据将顶替该页数据,其列表的页数与总条数相应减少'/> + <except id='4' value='数据被全部删除,列表显示为空,其数据总条数变为0'/> + <except id='5' value='当前搜索条件下的数据被全部删除,列表显示为空,但重置搜索后能看到非搜索内容的选项'/> + </excepts> </case> </cases> diff --git a/src/main/java/pres/auxiliary/work/n/tcase/Case.java b/src/main/java/pres/auxiliary/work/n/testcase/Case.java similarity index 96% rename from src/main/java/pres/auxiliary/work/n/tcase/Case.java rename to src/main/java/pres/auxiliary/work/n/testcase/Case.java index f3698c6..f80b87c 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/Case.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/Case.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; import java.io.File; import java.util.ArrayList; @@ -275,10 +275,10 @@ public abstract class Case { } //添加预期 - if (ids[0].equals(ALL)) { + if (ids[1].equals(ALL)) { addFieldText(LabelType.EXCEPT, getAllLabelText(caseName, LabelType.EXCEPT)); } else { - addFieldText(LabelType.EXCEPT, getLabelText(caseName, LabelType.EXCEPT, ids[0])); + addFieldText(LabelType.EXCEPT, getLabelText(caseName, LabelType.EXCEPT, ids[1])); } } } diff --git a/src/main/java/pres/auxiliary/work/n/tcase/CaseContentException.java b/src/main/java/pres/auxiliary/work/n/testcase/CaseContentException.java similarity index 92% rename from src/main/java/pres/auxiliary/work/n/tcase/CaseContentException.java rename to src/main/java/pres/auxiliary/work/n/testcase/CaseContentException.java index 6f05d5e..9ed0ab5 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/CaseContentException.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/CaseContentException.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; /** * <p><b>文件名:</b>CaseContentException.java</p> diff --git a/src/main/java/pres/auxiliary/work/n/tcase/DataListCase.java b/src/main/java/pres/auxiliary/work/n/testcase/DataListCase.java similarity index 58% rename from src/main/java/pres/auxiliary/work/n/tcase/DataListCase.java rename to src/main/java/pres/auxiliary/work/n/testcase/DataListCase.java index ea9f63c..5114535 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/DataListCase.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/DataListCase.java @@ -1,6 +1,7 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; import java.io.File; +import java.io.IOException; /** * <p><b>文件名:</b>DataListCase.java</p> @@ -100,9 +101,6 @@ public class DataListCase extends Case { //添加步骤与预期 relevanceAddData(caseName, ALL, ALL); - //存储预期信息 - addFieldText(LabelType.EXCEPT, getAllLabelText(caseName, LabelType.EXCEPT)); - //存储前置条件信息 addFieldText(LabelType.PRECONDITION, getAllLabelText(caseName, LabelType.PRECONDITION)); @@ -123,7 +121,7 @@ public class DataListCase extends Case { //清空字段的内容 clearFieldText(); // 存储case标签的name属性内容 - String caseName = "addInputSearchCase"; + String caseName = "addSelectSearchCase"; //添加替换词语 wordMap.put(WordType.SEARCH_CONDITION.getName(), condition); @@ -132,7 +130,60 @@ public class DataListCase extends Case { addFieldText(LabelType.TITLE, getLabelText(caseName, LabelType.TITLE, "1")); //添加步骤与预期 - relevanceAddData(caseName, ALL, ALL); + //选择第一个选项 + relevanceAddData(caseName, "1", "1"); + //选择中间选项 + relevanceAddData(caseName, "2", "1"); + //选择最后选项 + relevanceAddData(caseName, "3", "1"); + //不选择 + relevanceAddData(caseName, "4", "4"); + //选择都不包含 + relevanceAddData(caseName, "5", "5"); + + //存储前置条件信息 + 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; + } + + /** + * 用于添加联动选择条件对列表进行搜索的测试用例,当存在联动选项时可使用该方法生成用例。 + * 若搜索条件为最下级时,相当于普通下拉选择框,可以考虑调用{@link #selectSearchCase(String)}方法 + * @param condition 搜索条件(控件)名称 + * @param downCondition 下级搜索条件(控件)名称 + * @return 类本身 + */ + public Case selectSearchCase(String condition, String downCondition) { + //清空字段的内容 + clearFieldText(); + // 存储case标签的name属性内容 + String caseName = "addSelectSearchCase"; + + //添加替换词语 + wordMap.put(WordType.SEARCH_CONDITION.getName(), condition); + //添加替换词语 + wordMap.put(WordType.DONW_CONDITION.getName(), downCondition); + + //存储标题信息 + addFieldText(LabelType.TITLE, getLabelText(caseName, LabelType.TITLE, "1")); + + //添加步骤与预期 + //选择第一个选项 + relevanceAddData(caseName, "1", "2"); + //选择中间选项 + relevanceAddData(caseName, "2", "2"); + //选择最后选项 + relevanceAddData(caseName, "3", "2"); + //不选择 + relevanceAddData(caseName, "4", "3"); + //选择都不包含 + relevanceAddData(caseName, "5", "5"); //存储前置条件信息 addFieldText(LabelType.PRECONDITION, getAllLabelText(caseName, LabelType.PRECONDITION)); @@ -239,6 +290,9 @@ public class DataListCase extends Case { // 存储case标签的name属性内容 String caseName = "addListSortCase"; + //添加替换词语 + wordMap.put(WordType.SEARCH_CONDITION.getName(), condition); + //存储标题信息 addFieldText(LabelType.TITLE, getLabelText(caseName, LabelType.TITLE, "1")); @@ -268,7 +322,10 @@ public class DataListCase extends Case { //清空字段的内容 clearFieldText(); // 存储case标签的name属性内容 - String caseName = "addListSortCase"; + String caseName = "addExportListCase"; + + //添加替换词语 + wordMap.put(WordType.EXPORT_BUTTON_NAME.getName(), exportButton); //存储标题信息 addFieldText(LabelType.TITLE, getLabelText(caseName, LabelType.TITLE, "1")); @@ -298,6 +355,141 @@ public class DataListCase extends Case { return this; } + /** + * 用于添加导入信息的测试用例 + * @return 类本身 + */ + public Case importListCase() { + //清空字段的内容 + clearFieldText(); + // 存储case标签的name属性内容 + String caseName = "addImportListCase"; + + //存储标题信息 + 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; + } + + /** + * 用于生成重置搜索功能的测试用例 + * @return 类本身 + */ + public Case resetSearchCase() { + //清空字段的内容 + clearFieldText(); + // 存储case标签的name属性内容 + String caseName = "addResetSearchCase"; + + //存储标题信息 + 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; + } + + /** + * 该方法用于生成切换列表单页数据显示量的用例 + * @return + * @throws IOException + */ + public Case switchListShowDataCase() { + //清空字段的内容 + clearFieldText(); + // 存储case标签的name属性内容 + String caseName = "addSwitchListShowDataCase"; + + //存储标题信息 + 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; + } + + /** + * 用于生成删除列表数据相关的测试用例 + * @param delectButton 删除按钮名称 + * @return 类本身 + */ + public Case delectDataCase(String delectButton) { + //清空字段的内容 + clearFieldText(); + // 存储case标签的name属性内容 + String caseName = "delectDataCase"; + + //添加替换词语 + wordMap.put(WordType.DELECT_BUTTON.getName(), delectButton); + + //存储标题信息 + addFieldText(LabelType.TITLE, getLabelText(caseName, LabelType.TITLE, "1")); + + //---------------------------------------- + //不选择 + relevanceAddData(caseName, "1", "1"); + //选择第一条删除 + relevanceAddData(caseName, "2", "2"); + //选择最后删除 + relevanceAddData(caseName, "3", "2"); + //选择多条删除 + relevanceAddData(caseName, "4", "2"); + //选择一页数据删除 + relevanceAddData(caseName, "5", "3"); + //在只有一页数据的情况下,全选 + relevanceAddData(caseName, "6", "4"); + //列表搜索后勾选部分数据 + relevanceAddData(caseName, "7", "2"); + //列表搜索后数据全选 + relevanceAddData(caseName, "8", "5"); + //---------------------------------------- + + //存储前置条件信息 + 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; + } + /** * <p><b>文件名:</b>DataListCase.java</p> * <p><b>用途:</b>枚举在预设测试用例中需要被替换的词语</p> @@ -329,6 +521,14 @@ public class DataListCase extends Case { * 导出按钮 */ EXPORT_BUTTON_NAME("导出按钮"), + /** + * 下级选项 + */ + DONW_CONDITION("下级选项"), + /** + * 删除按钮 + */ + DELECT_BUTTON("删除按钮"), ; /** * 存储需要替换的单词名称 diff --git a/src/main/java/pres/auxiliary/work/n/tcase/FieldType.java b/src/main/java/pres/auxiliary/work/n/testcase/FieldType.java similarity index 92% rename from src/main/java/pres/auxiliary/work/n/tcase/FieldType.java rename to src/main/java/pres/auxiliary/work/n/testcase/FieldType.java index 94f3578..0e1e2be 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/FieldType.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/FieldType.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; /** * <p><b>文件名:</b>FieidType.java</p> diff --git a/src/main/java/pres/auxiliary/work/n/tcase/IncorrectFileException.java b/src/main/java/pres/auxiliary/work/n/testcase/IncorrectFileException.java similarity index 91% rename from src/main/java/pres/auxiliary/work/n/tcase/IncorrectFileException.java rename to src/main/java/pres/auxiliary/work/n/testcase/IncorrectFileException.java index 566b828..0f88e12 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/IncorrectFileException.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/IncorrectFileException.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; /** * <p><b>文件名:</b>IncorrectFileException.java</p> diff --git a/src/main/java/pres/auxiliary/work/n/tcase/InformationCase.java b/src/main/java/pres/auxiliary/work/n/testcase/InformationCase.java similarity index 97% rename from src/main/java/pres/auxiliary/work/n/tcase/InformationCase.java rename to src/main/java/pres/auxiliary/work/n/testcase/InformationCase.java index 55986f5..e65d8a8 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/InformationCase.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/InformationCase.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; import java.io.File; import java.util.Arrays; diff --git a/src/main/java/pres/auxiliary/work/n/tcase/LabelNotFoundException.java b/src/main/java/pres/auxiliary/work/n/testcase/LabelNotFoundException.java similarity index 89% rename from src/main/java/pres/auxiliary/work/n/tcase/LabelNotFoundException.java rename to src/main/java/pres/auxiliary/work/n/testcase/LabelNotFoundException.java index 329ce06..d29588e 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/LabelNotFoundException.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/LabelNotFoundException.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; public class LabelNotFoundException extends RuntimeException { diff --git a/src/main/java/pres/auxiliary/work/n/tcase/LabelType.java b/src/main/java/pres/auxiliary/work/n/testcase/LabelType.java similarity index 90% rename from src/main/java/pres/auxiliary/work/n/tcase/LabelType.java rename to src/main/java/pres/auxiliary/work/n/testcase/LabelType.java index 7e3ce7f..2023a1a 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/LabelType.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/LabelType.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; /** * <p><b>文件名:</b>LabelType.java</p> diff --git a/src/main/java/pres/auxiliary/work/n/tcase/MarkColorsType.java b/src/main/java/pres/auxiliary/work/n/testcase/MarkColorsType.java similarity index 91% rename from src/main/java/pres/auxiliary/work/n/tcase/MarkColorsType.java rename to src/main/java/pres/auxiliary/work/n/testcase/MarkColorsType.java index d31933a..c72a0cb 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/MarkColorsType.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/MarkColorsType.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; import org.apache.poi.ss.usermodel.IndexedColors; diff --git a/src/main/java/pres/auxiliary/work/n/tcase/TestCaseTemplet.java b/src/main/java/pres/auxiliary/work/n/testcase/TestCaseTemplet.java similarity index 96% rename from src/main/java/pres/auxiliary/work/n/tcase/TestCaseTemplet.java rename to src/main/java/pres/auxiliary/work/n/testcase/TestCaseTemplet.java index fe1e303..28c43a6 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/TestCaseTemplet.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/TestCaseTemplet.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; import java.io.File; import java.io.FileOutputStream; diff --git a/src/main/java/pres/auxiliary/work/n/tcase/TestCaseWrite.java b/src/main/java/pres/auxiliary/work/n/testcase/TestCaseWrite.java similarity index 97% rename from src/main/java/pres/auxiliary/work/n/tcase/TestCaseWrite.java rename to src/main/java/pres/auxiliary/work/n/testcase/TestCaseWrite.java index cb7c4af..535c706 100644 --- a/src/main/java/pres/auxiliary/work/n/tcase/TestCaseWrite.java +++ b/src/main/java/pres/auxiliary/work/n/testcase/TestCaseWrite.java @@ -1,4 +1,4 @@ -package pres.auxiliary.work.n.tcase; +package pres.auxiliary.work.n.testcase; import java.io.File; import java.io.FileInputStream; diff --git a/src/test/java/pres/auxiliary/work/testcase/DataListCaseTest.java b/src/test/java/pres/auxiliary/work/testcase/DataListCaseTest.java new file mode 100644 index 0000000..c418ab5 --- /dev/null +++ b/src/test/java/pres/auxiliary/work/testcase/DataListCaseTest.java @@ -0,0 +1,185 @@ +package pres.auxiliary.work.testcase; + +import java.io.File; + +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import pres.auxiliary.work.n.testcase.DataListCase; +import pres.auxiliary.work.n.testcase.LabelType; +import pres.auxiliary.work.n.testcase.TestCaseTemplet; +import pres.auxiliary.work.n.testcase.TestCaseWrite; + +public class DataListCaseTest { + /** + * 指向生成的测试用例文件 + */ + File testCaseFile = new File("src/test/java/pres/auxiliary/work/testcase/测试用例.xlsx"); + /** + * 指向测试用例文件字段配置文件 + */ + File templetXml = new File("ConfigurationFiles/CaseConfigurationFile/FileTemplet/jira测试用例导入模板.xml"); + /** + * 指向与InformationCase使用到的预设测试用例配置文件 + */ + File browseListCase = new File("ConfigurationFiles/CaseConfigurationFile/CaseTemplet/BrowseList.xml"); + + DataListCase dc = new DataListCase(browseListCase); + /** + * 用于写入用例到文件中 + */ + TestCaseWrite tcw; + + @BeforeClass + public void start() throws Exception { + TestCaseTemplet tct = new TestCaseTemplet(templetXml, testCaseFile); + //为方便演示,则允许覆盖用例文件 + tct.setCoverFile(true); + //生成用例文件 + tct.create(); + + //初始化 + tcw = new TestCaseWrite(templetXml, testCaseFile); + + dc.setReplaceWord(DataListCase.DATA_NAME, "用户"); + + //设置测试用例文件中字段与测试用例模板中的字段对应关系 + tcw.relevanceCase("步骤", LabelType.STEP.getName()); + tcw.relevanceCase("预期", LabelType.EXCEPT.getName()); + tcw.relevanceCase("优先级", LabelType.RANK.getName()); + tcw.relevanceCase("前置条件", LabelType.PRECONDITION.getName()); + tcw.relevanceCase("标题", LabelType.TITLE.getName()); + + //设置每条测试用例中值都一样的字段 + tcw.setFieldValue("设计者", "彭宇琦"); + tcw.setFieldValue("状态", "2"); + } + + @AfterClass + public void outputInformation() throws Exception { + //写入用例 + tcw.writeFile(); + //打开用例文件夹 + java.awt.Desktop.getDesktop().open(testCaseFile.getParentFile()); + java.awt.Desktop.getDesktop().open(testCaseFile); + } + + @AfterMethod + public void endCase() { + tcw.end(); + } + + /** + * 测试{@link DataListCase#appBrowseListCase()} + */ + @Test + public void appBrowseListCaseTest() { + tcw.addCase(dc.appBrowseListCase()); + } + + /** + * 测试{@link DataListCase#dateSearchCase(String)} + */ + @Test + public void dateSearchCaseTest() { + tcw.addCase(dc.dateSearchCase("考勤时间")); + } + + /** + * 测试{@link DataListCase#exportListCase(String, boolean)} + */ + @Test + public void exportListCaseTest_True() { + tcw.addCase(dc.exportListCase("导出数据", true)); + } + + /** + * 测试{@link DataListCase#exportListCase(String, boolean)} + */ + @Test + public void exportListCaseTest_false() { + tcw.addCase(dc.exportListCase("导出数据", false)); + } + + /** + * 测试{@link DataListCase#importListCase()} + */ + @Test + public void importListCaseTest() { + tcw.addCase(dc.importListCase()); + } + + /** + * 测试{@link DataListCase#listSortCase(String)} + */ + @Test + public void listSortCaseTest() { + tcw.addCase(dc.listSortCase("创建时间")); + } + + /** + * 测试{@link DataListCase#resetSearchCase()} + */ + @Test + public void resetSearchCaseTest() { + tcw.addCase(dc.resetSearchCase()); + } + + /** + * 测试{@link DataListCase#selectSearchCase(String)} + */ + @Test + public void selectSearchCaseTest_String() { + tcw.addCase(dc.selectSearchCase("班组")); + } + + /** + * 测试{@link DataListCase#selectSearchCase(String, String)} + */ + @Test + public void selectSearchCaseTest_StringString() { + tcw.addCase(dc.selectSearchCase("企业单位", "班组")); + } + + /** + * 测试{@link DataListCase#switchListShowDataCase()} + */ + @Test + public void switchListShowDataCaseTest() { + tcw.addCase(dc.switchListShowDataCase()); + } + + /** + * 测试{@link DataListCase#textboxSearchCase(String)} + */ + @Test + public void textboxSearchCaseTest() { + tcw.addCase(dc.textboxSearchCase("统一社会信用代码")); + } + + /** + * 测试{@link DataListCase#timeQuantumSearchCase(String, String)} + */ + @Test + public void timeQuantumSearchCaseTest() { + tcw.addCase(dc.timeQuantumSearchCase("开工时间", "竣工时间")); + } + + /** + * 测试{@link DataListCase#webBrowseListCase()} + */ + @Test + public void webBrowseListCaseTest() { + tcw.addCase(dc.webBrowseListCase()); + } + + /** + * 测试{@link DataListCase#delectDataCase(String)} + */ + @Test + public void delectDataCaseTest() { + tcw.addCase(dc.delectDataCase("删除")); + } +} diff --git a/src/test/java/pres/auxiliary/work/testcase/InformationCaseTest.java b/src/test/java/pres/auxiliary/work/testcase/InformationCaseTest.java index dc660ac..8e6a4a2 100644 --- a/src/test/java/pres/auxiliary/work/testcase/InformationCaseTest.java +++ b/src/test/java/pres/auxiliary/work/testcase/InformationCaseTest.java @@ -6,14 +6,14 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import pres.auxiliary.work.n.tcase.CaseContentException; -import pres.auxiliary.work.n.tcase.InformationCase; -import pres.auxiliary.work.n.tcase.InformationCase.FileRuleType; -import pres.auxiliary.work.n.tcase.InformationCase.InputRuleType; -import pres.auxiliary.work.n.tcase.InformationCase.UploadFileType; +import pres.auxiliary.work.n.testcase.CaseContentException; +import pres.auxiliary.work.n.testcase.InformationCase; +import pres.auxiliary.work.n.testcase.InformationCase.FileRuleType; +import pres.auxiliary.work.n.testcase.InformationCase.InputRuleType; +import pres.auxiliary.work.n.testcase.InformationCase.UploadFileType; public class InformationCaseTest { -InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfigurationFile/CaseTemplet/AddInformation.xml")); + InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfigurationFile/CaseTemplet/AddInformation.xml")); @BeforeClass public void start() { @@ -180,7 +180,7 @@ InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfig } /** - * 测试{@link InformationCase#addPhoneCase(String, boolean, boolean, boolean, pres.auxiliary.work.n.tcase.InformationCase.PhoneType...)}方法 + * 测试{@link InformationCase#addPhoneCase(String, boolean, boolean, boolean, pres.auxiliary.work.n.testcase.InformationCase.PhoneType...)}方法 */ @Test public void addPhoneCaseTest_Fixed() { @@ -188,7 +188,7 @@ InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfig } /** - * 测试{@link InformationCase#addPhoneCase(String, boolean, boolean, boolean, pres.auxiliary.work.n.tcase.InformationCase.PhoneType...)}方法 + * 测试{@link InformationCase#addPhoneCase(String, boolean, boolean, boolean, pres.auxiliary.work.n.testcase.InformationCase.PhoneType...)}方法 */ @Test public void addPhoneCaseTest_Moble() { @@ -196,7 +196,7 @@ InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfig } /** - * 测试{@link InformationCase#addPhoneCase(String, boolean, boolean, boolean, pres.auxiliary.work.n.tcase.InformationCase.PhoneType...)}方法 + * 测试{@link InformationCase#addPhoneCase(String, boolean, boolean, boolean, pres.auxiliary.work.n.testcase.InformationCase.PhoneType...)}方法 */ @Test public void addPhoneCaseTest_All() { @@ -284,7 +284,7 @@ InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfig } /** - * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.tcase.InformationCase.UploadFileType, pres.auxiliary.work.n.tcase.InformationCase.FileRuleType...)}方法 + * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.testcase.InformationCase.UploadFileType, pres.auxiliary.work.n.testcase.InformationCase.FileRuleType...)}方法 */ @Test public void addUploadFileCaseTest_1() { @@ -292,7 +292,7 @@ InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfig } /** - * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.tcase.InformationCase.UploadFileType, pres.auxiliary.work.n.tcase.InformationCase.FileRuleType...)}方法 + * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.testcase.InformationCase.UploadFileType, pres.auxiliary.work.n.testcase.InformationCase.FileRuleType...)}方法 */ @Test public void addUploadFileCaseTest_2() { @@ -300,7 +300,7 @@ InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfig } /** - * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.tcase.InformationCase.UploadFileType, pres.auxiliary.work.n.tcase.InformationCase.FileRuleType...)}方法 + * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.testcase.InformationCase.UploadFileType, pres.auxiliary.work.n.testcase.InformationCase.FileRuleType...)}方法 */ @Test public void addUploadFileCaseTest_3() { @@ -308,7 +308,7 @@ InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfig } /** - * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.tcase.InformationCase.UploadFileType, pres.auxiliary.work.n.tcase.InformationCase.FileRuleType...)}方法 + * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.testcase.InformationCase.UploadFileType, pres.auxiliary.work.n.testcase.InformationCase.FileRuleType...)}方法 */ @Test public void addUploadFileCaseTest_4() { @@ -316,7 +316,7 @@ InformationCase ic = new InformationCase(new File("ConfigurationFiles/CaseConfig } /** - * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.tcase.InformationCase.UploadFileType, pres.auxiliary.work.n.tcase.InformationCase.FileRuleType...)}方法 + * 测试{@link InformationCase#addUploadFileCase(String, boolean, boolean, boolean, int, int, int, pres.auxiliary.work.n.testcase.InformationCase.UploadFileType, pres.auxiliary.work.n.testcase.InformationCase.FileRuleType...)}方法 */ @Test public void addUploadFileCaseTest_5() { diff --git a/src/test/java/pres/auxiliary/work/testcase/ProgramWriteTestCaseDemo.java b/src/test/java/pres/auxiliary/work/testcase/ProgramWriteTestCaseDemo.java index ed62a54..eb2e3e4 100644 --- a/src/test/java/pres/auxiliary/work/testcase/ProgramWriteTestCaseDemo.java +++ b/src/test/java/pres/auxiliary/work/testcase/ProgramWriteTestCaseDemo.java @@ -10,12 +10,12 @@ import org.testng.annotations.BeforeGroups; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import pres.auxiliary.work.n.tcase.InformationCase; -import pres.auxiliary.work.n.tcase.InformationCase.InputRuleType; -import pres.auxiliary.work.n.tcase.LabelType; -import pres.auxiliary.work.n.tcase.MarkColorsType; -import pres.auxiliary.work.n.tcase.TestCaseTemplet; -import pres.auxiliary.work.n.tcase.TestCaseWrite; +import pres.auxiliary.work.n.testcase.InformationCase; +import pres.auxiliary.work.n.testcase.LabelType; +import pres.auxiliary.work.n.testcase.MarkColorsType; +import pres.auxiliary.work.n.testcase.TestCaseTemplet; +import pres.auxiliary.work.n.testcase.TestCaseWrite; +import pres.auxiliary.work.n.testcase.InformationCase.InputRuleType; public class ProgramWriteTestCaseDemo { /** diff --git a/src/test/java/pres/auxiliary/work/testcase/TestCaseTempletTest.java b/src/test/java/pres/auxiliary/work/testcase/TestCaseTempletTest.java index d9d898d..169857f 100644 --- a/src/test/java/pres/auxiliary/work/testcase/TestCaseTempletTest.java +++ b/src/test/java/pres/auxiliary/work/testcase/TestCaseTempletTest.java @@ -9,8 +9,8 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import pres.auxiliary.work.n.tcase.IncorrectFileException; -import pres.auxiliary.work.n.tcase.TestCaseTemplet; +import pres.auxiliary.work.n.testcase.IncorrectFileException; +import pres.auxiliary.work.n.testcase.TestCaseTemplet; public class TestCaseTempletTest { /** diff --git a/src/test/java/pres/auxiliary/work/testcase/WriteTestCaseTest.java b/src/test/java/pres/auxiliary/work/testcase/WriteTestCaseTest.java index ae54a53..5523ce4 100644 --- a/src/test/java/pres/auxiliary/work/testcase/WriteTestCaseTest.java +++ b/src/test/java/pres/auxiliary/work/testcase/WriteTestCaseTest.java @@ -11,13 +11,13 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import pres.auxiliary.work.n.tcase.FieldType; -import pres.auxiliary.work.n.tcase.InformationCase; -import pres.auxiliary.work.n.tcase.LabelType; -import pres.auxiliary.work.n.tcase.MarkColorsType; -import pres.auxiliary.work.n.tcase.TestCaseTemplet; -import pres.auxiliary.work.n.tcase.TestCaseWrite; -import pres.auxiliary.work.n.tcase.TestCaseWrite.CaseMark; +import pres.auxiliary.work.n.testcase.FieldType; +import pres.auxiliary.work.n.testcase.InformationCase; +import pres.auxiliary.work.n.testcase.LabelType; +import pres.auxiliary.work.n.testcase.MarkColorsType; +import pres.auxiliary.work.n.testcase.TestCaseTemplet; +import pres.auxiliary.work.n.testcase.TestCaseWrite; +import pres.auxiliary.work.n.testcase.TestCaseWrite.CaseMark; /** * <p> @@ -112,7 +112,7 @@ public class WriteTestCaseTest { } /** - * 测试{@link TestCaseWrite#addCase(pres.auxiliary.work.n.tcase.Case)}方法 + * 测试{@link TestCaseWrite#addCase(pres.auxiliary.work.n.testcase.Case)}方法 */ @Test public void addCaseTest() { diff --git a/src/test/java/pres/auxiliary/work/testcase/测试用例.xlsx b/src/test/java/pres/auxiliary/work/testcase/测试用例.xlsx index e9fbbdf180739642a57a7c0c27dfeb6bf3e60a92..8c76c0ee34b8aac7c2cd5efcebdb3a60c9bbdb68 100644 GIT binary patch delta 6796 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 delta 7767 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 H-R=B810mK|