├── .gitattributes
├── .gitignore
├── .idea
├── .gitignore
├── compiler.xml
├── encodings.xml
├── misc.xml
└── vcs.xml
├── Dockerfile
├── README.md
├── allure-results
├── 04254a7b-6cfa-45dd-bcc8-b6e9fffc0575-container.json
├── 047586f6-20d3-40c5-bc19-a7c22396890f-container.json
├── 09d3a09f-7b79-4883-a688-d91189ec1500-container.json
├── 1c8bd668-f52b-4b79-8444-48231ffef5d4-container.json
├── 24a8d093-bf10-4512-8c3c-be02defe92f0-result.json
├── 277427b6-6ec7-41f7-8ea4-4f49223d04bc-container.json
├── 28f33310-3b0c-4d92-a709-89c3c18c482c-container.json
├── 295a76f3-cf06-4cd8-b05b-6099cc3a5c2b-result.json
├── 2a612220-49ef-4e1d-9bcc-2e9a2e4dd0b4-result.json
├── 2e4aa861-8a82-4687-8e98-8634967b3445-container.json
├── 349b293e-e3f7-4ecb-9c1c-5ca9329776b2-container.json
├── 4718a26e-2d86-495f-8566-7269e150b666-container.json
├── 4a8a4f53-5975-4c41-bb0b-f56209d8a85d-container.json
├── 57fe5ed7-b155-4762-907a-b931eed869a7-container.json
├── 7271ebb1-f987-409e-91ea-2bc4f275cc12-container.json
├── 77d30321-4250-4ace-b403-01504dcfc6d2-container.json
├── 8aacbeb5-5ba6-4aca-946c-f7ade72411d6-result.json
├── 9632b653-fbeb-4baa-a6ac-ceb73b13008c-container.json
├── a1e93c62-ede2-445b-bd5a-1c1eae4f9ffd-container.json
├── ca0d5021-bc46-4670-a63d-5790bf49cd50-container.json
├── ce62675b-5caf-4262-b409-ea3bbfe266d8-container.json
├── e9977e95-297b-499c-aa8d-87d0e7c00602-container.json
├── f723aea0-c711-4bf0-a2ea-8c868420050c-result.json
└── f907ec45-a992-46d3-a226-9b3920083580-result.json
├── database
└── javaelf_init.sql
├── docker-auto.sh
├── pom.xml
└── src
├── main
├── java
│ ├── com
│ │ └── javaelf
│ │ │ ├── JavaElfApplication.java
│ │ │ ├── base
│ │ │ └── TestBase.java
│ │ │ ├── controller
│ │ │ └── TestResultsController.java
│ │ │ ├── dao
│ │ │ ├── InterfaceMsgDao.java
│ │ │ ├── TestCaseDao.java
│ │ │ └── VariableSubstitutionDao.java
│ │ │ ├── data
│ │ │ ├── CardIDGenerator.java
│ │ │ ├── CharNumberGenerator.java
│ │ │ ├── NumberGenerator.java
│ │ │ └── RandomGenerator.java
│ │ │ ├── dataForger
│ │ │ └── TestDataFactory.java
│ │ │ ├── entity
│ │ │ ├── InterfaceMsg.java
│ │ │ ├── InterfaceMsg_.java
│ │ │ ├── TestCase.java
│ │ │ ├── TestCase_.java
│ │ │ ├── TestStreamEntity.java
│ │ │ ├── VariableSubstitution.java
│ │ │ └── VariableSubstitution_.java
│ │ │ ├── listener
│ │ │ └── AssertListener.java
│ │ │ ├── service
│ │ │ ├── TestResultService.java
│ │ │ └── impl
│ │ │ │ ├── JpaWXCaseService.java
│ │ │ │ └── TestResultServiceImpl.java
│ │ │ ├── swagger2
│ │ │ ├── Swagger2Config.java
│ │ │ └── example
│ │ │ │ ├── ParaPost.java
│ │ │ │ └── PostCase.java
│ │ │ ├── testcase
│ │ │ └── QYWXTestCase.java
│ │ │ └── utils
│ │ │ ├── AssertionOverrideUtil.java
│ │ │ ├── Base64Util.java
│ │ │ ├── BaseTestngInit.java
│ │ │ ├── CreateIDCardNo.java
│ │ │ ├── DateUtils.java
│ │ │ ├── EasyPoiExcelStyleUtil.java
│ │ │ ├── EasyPoiUtil.java
│ │ │ ├── Json.java
│ │ │ ├── JsonUtils.java
│ │ │ ├── LoadStaticConfigUtil.java
│ │ │ ├── Log4jUtil.java
│ │ │ ├── RandomDataKit.java
│ │ │ ├── RestTemplateUtils.java
│ │ │ ├── SendEmail.java
│ │ │ ├── SpringContextUtil.java
│ │ │ └── VariableUtil.java
│ └── org
│ │ └── hibernate
│ │ └── cfg
│ │ └── PropertyContainer.java
└── resources
│ ├── MindUML.puml
│ ├── application-dev.yml
│ ├── application.yml
│ ├── log4j2.xml
│ ├── mock
│ ├── have-paramaters-get.json
│ ├── have-paramaters-post-json.json
│ ├── have-paramaters-post.json
│ ├── json-paramaters-havecookies-post-2.json
│ ├── json-paramaters-havecookies-post.json
│ ├── json-paramaters-haveheaders-post.json
│ ├── no-paramaters-get-302.json
│ ├── no-paramaters-get-responsehavecookies.json
│ ├── no-paramaters-get1.json
│ ├── no-paramaters-get2.json
│ ├── no-paramaters-post.json
│ ├── noparamaters-havecookies-get.json
│ └── readme.md
│ ├── static
│ ├── css
│ │ └── extent.css
│ ├── index.html
│ └── js
│ │ └── extent.js
│ ├── testcaseexcel
│ └── 企业微信接口测试集.xls
│ └── testng.xml
└── test
└── java
└── testcase
├── Algorithm.java
├── ConcurrentTestCase.java
├── RandomParameter.java
├── SpringBootTestCase.java
├── StreamStudy.java
├── StreamStudyCase.java
├── SumJavaLine.java
├── Test.java
└── TestCaseDemo.java
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.js linguist-language=java
2 | *.css linguist-language=java
3 | *.html linguist-language=java
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiled class file
2 | *.class
3 |
4 | # Log file
5 | *.log
6 |
7 | # BlueJ files
8 | *.ctxt
9 |
10 | # Mobile Tools for Java (J2ME)
11 | .mtj.tmp/
12 |
13 | # Package Files #
14 | *.jar
15 | *.war
16 | *.nar
17 | *.ear
18 | *.zip
19 | *.tar.gz
20 | *.rar
21 |
22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
23 | hs_err_pid*
24 |
25 | .idea
26 | *.iws
27 | *.iml
28 | *.ipr
29 | target/
30 | testoutput/
31 | test-output/
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /workspace.xml
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
22 |
23 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # 基础镜像是docker仓库的java:8(JDK8)
2 | FROM java:8
3 | # 作者签名
4 | MAINTAINER czy czy725@yeat.com
5 | # 挂载宿主机jar包到镜像 /platform-pay-1.0.0.jar 和 下个指令对应即可,命名并非一定要和jar名一样,为了能够识别
6 | copy test-1.0-SNAPSHOT.jar /test-1.0-SNAPSHOT.jar
7 | # 执行 java -jar 命令,启动容器跟随启动
8 | CMD java -jar /test-1.0-SNAPSHOT.jar
9 | # 设置对外端口为 8090
10 | EXPOSE 8090
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # java-elf 项目实行接口关键字+数据驱动模式开发测试
2 |
3 | - 关键字
4 |
5 | 该项目可以通过”接口名称“关键字,匹配该接口名称下的测试用例。
6 |
7 | - 数据驱动数据驱动目前实行两种途径
8 |
9 | 1、excel数据驱动(比较传统)
10 | 示例代码见:EasypoiWxCaseService类
11 |
12 | 2、数据库数据驱动(更易用于扩展)
13 | 示例代码见:JpaWXCaseService类
14 |
15 | 可以根据自己维护用例的习惯进行其中的数据驱动选择
16 |
17 | 3、持续测试集成
18 | 配置jdk环境和maven环境并运行:
19 | ```$xslt
20 | mvn clean test
21 | ```
22 | 执行testng.xml文件中配置的测试套件
23 |
24 | 4、本地maven编译推送至远程maven库
25 | ```
26 | mvn clean deploy -X -Dmaven.test.skip=true
27 |
28 | ```
29 |
30 | 4、~~功能废弃-新增测试用例动态生成(必填项为空,必填项缺省、超长长度...),实际测试中后端对于必填为空、超长长度、类型不一致等校验统一处理,验证一个即为其他为参数空情况的验证覆盖~~
31 | ```
32 | //简单示例
33 | //请求参数
34 | {
35 | "parames1": "11",
36 | "parames2": "22",
37 | "parames3": "33"
38 | }
39 | //返回结果
40 | {
41 | "参数值:parames1为空返回结果": {
42 | "parames1": "",
43 | "parames2": "22",
44 | "parames3": "33"
45 | },
46 | "参数值:parames2为空返回结果": {
47 | "parames1": "11",
48 | "parames2": "",
49 | "parames3": "33"
50 | },
51 | "参数值:parames3为空返回结果": {
52 | "parames1": "11",
53 | "parames2": "22",
54 | "parames3": ""
55 | }
56 | }
57 |
58 | ```
59 | 5、跳出接口测试误区,接口更适合做冒烟和回归测试。虽然接口测试的本质也是功能测试,但接口的测试粒度应该是根据后端接收参数处理逻辑来定。
60 |
61 | 6、增加随机数据生成:
62 | ```
63 | Random(String[0,10])
64 | Random(Char[10])
65 | Random(Long[10])
66 | Random(Boolean)
67 | 入参数参数直接写随机函数即可,eg:
68 | {
69 | "data":{
70 | "key1":"测试-numRandom(Long[2])",
71 | "key2":"测试-Random(Char[3])"
72 | }
73 | }
74 | //对应会生成:测试-num34的随机数和测试-jh的随机数
75 | ```
76 |
--------------------------------------------------------------------------------
/allure-results/04254a7b-6cfa-45dd-bcc8-b6e9fffc0575-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"04254a7b-6cfa-45dd-bcc8-b6e9fffc0575","name":"Default Suite","children":["1c8bd668-f52b-4b79-8444-48231ffef5d4"],"befores":[],"afters":[],"links":[],"start":1621758906533,"stop":1621758916718}
--------------------------------------------------------------------------------
/allure-results/047586f6-20d3-40c5-bc19-a7c22396890f-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"047586f6-20d3-40c5-bc19-a7c22396890f","name":"Java-elf","children":["2a612220-49ef-4e1d-9bcc-2e9a2e4dd0b4"],"befores":[],"afters":[],"links":[],"start":1619145174213,"stop":1619145184358}
--------------------------------------------------------------------------------
/allure-results/09d3a09f-7b79-4883-a688-d91189ec1500-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"09d3a09f-7b79-4883-a688-d91189ec1500","name":"Default Suite","children":["277427b6-6ec7-41f7-8ea4-4f49223d04bc"],"befores":[],"afters":[],"links":[],"start":1621759183869,"stop":1621759194026}
--------------------------------------------------------------------------------
/allure-results/1c8bd668-f52b-4b79-8444-48231ffef5d4-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"1c8bd668-f52b-4b79-8444-48231ffef5d4","name":"Java-elf","children":["f723aea0-c711-4bf0-a2ea-8c868420050c"],"befores":[],"afters":[],"links":[],"start":1621758906535,"stop":1621758916707}
--------------------------------------------------------------------------------
/allure-results/24a8d093-bf10-4512-8c3c-be02defe92f0-result.json:
--------------------------------------------------------------------------------
1 | {"name":"getTestRandom","status":"passed","statusDetails":{"known":false,"muted":false,"flaky":false},"stage":"finished","steps":[],"attachments":[],"parameters":[],"start":1619176776083,"stop":1619176776093,"uuid":"24a8d093-bf10-4512-8c3c-be02defe92f0","historyId":"9eb6e359eda1074ca0eb1ef24bf157fa","fullName":"testcase.TestCaseDemo.getTestRandom","labels":[{"name":"package","value":"testcase.TestCaseDemo"},{"name":"testClass","value":"testcase.TestCaseDemo"},{"name":"testMethod","value":"getTestRandom"},{"name":"parentSuite","value":"Default Suite"},{"name":"suite","value":"Java-elf"},{"name":"subSuite","value":"testcase.TestCaseDemo"},{"name":"host","value":"cuizhongyuandeMacBook-Pro.local"},{"name":"thread","value":"63540@cuizhongyuandeMacBook-Pro.local.main(1)"},{"name":"framework","value":"testng"},{"name":"language","value":"java"}],"links":[]}
--------------------------------------------------------------------------------
/allure-results/277427b6-6ec7-41f7-8ea4-4f49223d04bc-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"277427b6-6ec7-41f7-8ea4-4f49223d04bc","name":"Java-elf","children":["295a76f3-cf06-4cd8-b05b-6099cc3a5c2b"],"befores":[],"afters":[],"links":[],"start":1621759183872,"stop":1621759194020}
--------------------------------------------------------------------------------
/allure-results/28f33310-3b0c-4d92-a709-89c3c18c482c-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"28f33310-3b0c-4d92-a709-89c3c18c482c","name":"Default Suite","children":["349b293e-e3f7-4ecb-9c1c-5ca9329776b2"],"befores":[],"afters":[],"links":[],"start":1619181164525,"stop":1619181174684}
--------------------------------------------------------------------------------
/allure-results/295a76f3-cf06-4cd8-b05b-6099cc3a5c2b-result.json:
--------------------------------------------------------------------------------
1 | {"name":"lambadTest","status":"passed","statusDetails":{"known":false,"muted":false,"flaky":false},"stage":"finished","steps":[],"attachments":[],"parameters":[],"start":1621759193956,"stop":1621759193962,"uuid":"295a76f3-cf06-4cd8-b05b-6099cc3a5c2b","historyId":"d40d21be4620023b993d5e7d8844dce3","fullName":"testcase.StreamStudyCase.lambadTest","labels":[{"name":"package","value":"testcase.StreamStudyCase"},{"name":"testClass","value":"testcase.StreamStudyCase"},{"name":"testMethod","value":"lambadTest"},{"name":"parentSuite","value":"Default Suite"},{"name":"suite","value":"Java-elf"},{"name":"subSuite","value":"testcase.StreamStudyCase"},{"name":"host","value":"cuizhongyuandeMacBook-Pro.local"},{"name":"thread","value":"992@cuizhongyuandeMacBook-Pro.local.main(1)"},{"name":"framework","value":"testng"},{"name":"language","value":"java"}],"links":[]}
--------------------------------------------------------------------------------
/allure-results/2a612220-49ef-4e1d-9bcc-2e9a2e4dd0b4-result.json:
--------------------------------------------------------------------------------
1 | {"name":"getTestRandom","status":"passed","statusDetails":{"known":false,"muted":false,"flaky":false},"stage":"finished","steps":[],"attachments":[],"parameters":[],"start":1619145184295,"stop":1619145184305,"uuid":"2a612220-49ef-4e1d-9bcc-2e9a2e4dd0b4","historyId":"9eb6e359eda1074ca0eb1ef24bf157fa","fullName":"testcase.TestCaseDemo.getTestRandom","labels":[{"name":"package","value":"testcase.TestCaseDemo"},{"name":"testClass","value":"testcase.TestCaseDemo"},{"name":"testMethod","value":"getTestRandom"},{"name":"parentSuite","value":"Default Suite"},{"name":"suite","value":"Java-elf"},{"name":"subSuite","value":"testcase.TestCaseDemo"},{"name":"host","value":"cuizhongyuandeMacBook-Pro.local"},{"name":"thread","value":"8949@cuizhongyuandeMacBook-Pro.local.main(1)"},{"name":"framework","value":"testng"},{"name":"language","value":"java"}],"links":[]}
--------------------------------------------------------------------------------
/allure-results/2e4aa861-8a82-4687-8e98-8634967b3445-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"2e4aa861-8a82-4687-8e98-8634967b3445","name":"Default Suite","children":["a1e93c62-ede2-445b-bd5a-1c1eae4f9ffd"],"befores":[],"afters":[],"links":[],"start":1621759490392,"stop":1621759500543}
--------------------------------------------------------------------------------
/allure-results/349b293e-e3f7-4ecb-9c1c-5ca9329776b2-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"349b293e-e3f7-4ecb-9c1c-5ca9329776b2","name":"Java-elf","children":["8aacbeb5-5ba6-4aca-946c-f7ade72411d6"],"befores":[],"afters":[],"links":[],"start":1619181164528,"stop":1619181174677}
--------------------------------------------------------------------------------
/allure-results/4718a26e-2d86-495f-8566-7269e150b666-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"4718a26e-2d86-495f-8566-7269e150b666","name":"testcase.StreamStudyCase","children":["295a76f3-cf06-4cd8-b05b-6099cc3a5c2b"],"befores":[],"afters":[],"links":[],"start":1621759183876,"stop":1621759194024}
--------------------------------------------------------------------------------
/allure-results/4a8a4f53-5975-4c41-bb0b-f56209d8a85d-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"4a8a4f53-5975-4c41-bb0b-f56209d8a85d","name":"Java-elf","children":["24a8d093-bf10-4512-8c3c-be02defe92f0"],"befores":[],"afters":[],"links":[],"start":1619176765990,"stop":1619176776158}
--------------------------------------------------------------------------------
/allure-results/57fe5ed7-b155-4762-907a-b931eed869a7-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"57fe5ed7-b155-4762-907a-b931eed869a7","name":"Default Suite","children":["4a8a4f53-5975-4c41-bb0b-f56209d8a85d"],"befores":[],"afters":[],"links":[],"start":1619176765986,"stop":1619176776165}
--------------------------------------------------------------------------------
/allure-results/7271ebb1-f987-409e-91ea-2bc4f275cc12-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"7271ebb1-f987-409e-91ea-2bc4f275cc12","name":"testcase.TestCaseDemo","children":["24a8d093-bf10-4512-8c3c-be02defe92f0"],"befores":[],"afters":[],"links":[],"start":1619176765995,"stop":1619176776164}
--------------------------------------------------------------------------------
/allure-results/77d30321-4250-4ace-b403-01504dcfc6d2-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"77d30321-4250-4ace-b403-01504dcfc6d2","name":"testcase.StreamStudyCase","children":["f907ec45-a992-46d3-a226-9b3920083580"],"befores":[],"afters":[],"links":[],"start":1621759490398,"stop":1621759500542}
--------------------------------------------------------------------------------
/allure-results/8aacbeb5-5ba6-4aca-946c-f7ade72411d6-result.json:
--------------------------------------------------------------------------------
1 | {"name":"getTestRandom","status":"passed","statusDetails":{"known":false,"muted":false,"flaky":false},"stage":"finished","steps":[],"attachments":[],"parameters":[],"start":1619181174601,"stop":1619181174615,"uuid":"8aacbeb5-5ba6-4aca-946c-f7ade72411d6","historyId":"9eb6e359eda1074ca0eb1ef24bf157fa","fullName":"testcase.TestCaseDemo.getTestRandom","labels":[{"name":"package","value":"testcase.TestCaseDemo"},{"name":"testClass","value":"testcase.TestCaseDemo"},{"name":"testMethod","value":"getTestRandom"},{"name":"parentSuite","value":"Default Suite"},{"name":"suite","value":"Java-elf"},{"name":"subSuite","value":"testcase.TestCaseDemo"},{"name":"host","value":"cuizhongyuandeMacBook-Pro.local"},{"name":"thread","value":"73994@cuizhongyuandeMacBook-Pro.local.main(1)"},{"name":"framework","value":"testng"},{"name":"language","value":"java"}],"links":[]}
--------------------------------------------------------------------------------
/allure-results/9632b653-fbeb-4baa-a6ac-ceb73b13008c-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"9632b653-fbeb-4baa-a6ac-ceb73b13008c","name":"testcase.TestCaseDemo","children":["8aacbeb5-5ba6-4aca-946c-f7ade72411d6"],"befores":[],"afters":[],"links":[],"start":1619181164532,"stop":1619181174683}
--------------------------------------------------------------------------------
/allure-results/a1e93c62-ede2-445b-bd5a-1c1eae4f9ffd-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"a1e93c62-ede2-445b-bd5a-1c1eae4f9ffd","name":"Java-elf","children":["f907ec45-a992-46d3-a226-9b3920083580"],"befores":[],"afters":[],"links":[],"start":1621759490394,"stop":1621759500537}
--------------------------------------------------------------------------------
/allure-results/ca0d5021-bc46-4670-a63d-5790bf49cd50-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"ca0d5021-bc46-4670-a63d-5790bf49cd50","name":"Default Suite","children":["047586f6-20d3-40c5-bc19-a7c22396890f"],"befores":[],"afters":[],"links":[],"start":1619145174210,"stop":1619145184370}
--------------------------------------------------------------------------------
/allure-results/ce62675b-5caf-4262-b409-ea3bbfe266d8-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"ce62675b-5caf-4262-b409-ea3bbfe266d8","name":"testcase.TestCaseDemo","children":["2a612220-49ef-4e1d-9bcc-2e9a2e4dd0b4"],"befores":[],"afters":[],"links":[],"start":1619145174218,"stop":1619145184368}
--------------------------------------------------------------------------------
/allure-results/e9977e95-297b-499c-aa8d-87d0e7c00602-container.json:
--------------------------------------------------------------------------------
1 | {"uuid":"e9977e95-297b-499c-aa8d-87d0e7c00602","name":"testcase.StreamStudyCase","children":["f723aea0-c711-4bf0-a2ea-8c868420050c"],"befores":[],"afters":[],"links":[],"start":1621758906540,"stop":1621758916716}
--------------------------------------------------------------------------------
/allure-results/f723aea0-c711-4bf0-a2ea-8c868420050c-result.json:
--------------------------------------------------------------------------------
1 | {"name":"lambadTest","status":"passed","statusDetails":{"known":false,"muted":false,"flaky":false},"stage":"finished","steps":[],"attachments":[],"parameters":[],"start":1621758916632,"stop":1621758916640,"uuid":"f723aea0-c711-4bf0-a2ea-8c868420050c","historyId":"d40d21be4620023b993d5e7d8844dce3","fullName":"testcase.StreamStudyCase.lambadTest","labels":[{"name":"package","value":"testcase.StreamStudyCase"},{"name":"testClass","value":"testcase.StreamStudyCase"},{"name":"testMethod","value":"lambadTest"},{"name":"parentSuite","value":"Default Suite"},{"name":"suite","value":"Java-elf"},{"name":"subSuite","value":"testcase.StreamStudyCase"},{"name":"host","value":"cuizhongyuandeMacBook-Pro.local"},{"name":"thread","value":"938@cuizhongyuandeMacBook-Pro.local.main(1)"},{"name":"framework","value":"testng"},{"name":"language","value":"java"}],"links":[]}
--------------------------------------------------------------------------------
/allure-results/f907ec45-a992-46d3-a226-9b3920083580-result.json:
--------------------------------------------------------------------------------
1 | {"name":"lambdaList","status":"passed","statusDetails":{"known":false,"muted":false,"flaky":false},"stage":"finished","steps":[],"attachments":[],"parameters":[],"start":1621759500476,"stop":1621759500482,"uuid":"f907ec45-a992-46d3-a226-9b3920083580","historyId":"995edcd3cefeac8983983e671a202b0","fullName":"testcase.StreamStudyCase.lambdaList","labels":[{"name":"package","value":"testcase.StreamStudyCase"},{"name":"testClass","value":"testcase.StreamStudyCase"},{"name":"testMethod","value":"lambdaList"},{"name":"parentSuite","value":"Default Suite"},{"name":"suite","value":"Java-elf"},{"name":"subSuite","value":"testcase.StreamStudyCase"},{"name":"host","value":"cuizhongyuandeMacBook-Pro.local"},{"name":"thread","value":"1064@cuizhongyuandeMacBook-Pro.local.main(1)"},{"name":"framework","value":"testng"},{"name":"language","value":"java"}],"links":[]}
--------------------------------------------------------------------------------
/database/javaelf_init.sql:
--------------------------------------------------------------------------------
1 | /*
2 | Navicat Premium Data Transfer
3 |
4 | Source Server : 192.168.1.225
5 | Source Server Type : MySQL
6 | Source Server Version : 50723
7 | Source Host : 192.168.1.225:3306
8 | Source Schema : javaelf
9 |
10 | Target Server Type : MySQL
11 | Target Server Version : 50723
12 | File Encoding : 65001
13 |
14 | Date: 05/11/2020 14:12:00
15 | */
16 |
17 | SET NAMES utf8mb4;
18 | SET FOREIGN_KEY_CHECKS = 0;
19 |
20 | -- ----------------------------
21 | -- Table structure for interface_msg
22 | -- ----------------------------
23 | DROP TABLE IF EXISTS `interface_msg`;
24 | CREATE TABLE `interface_msg` (
25 | `id` bigint(20) NOT NULL AUTO_INCREMENT,
26 | `request_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
27 | `url_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
28 | PRIMARY KEY (`id`) USING BTREE
29 | ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
30 |
31 | -- ----------------------------
32 | -- Records of interface_msg
33 | -- ----------------------------
34 | INSERT INTO `interface_msg` VALUES (1, 'post', 'https://qyapi.weixin.qq.com/cgi-bin/gettoken');
35 | INSERT INTO `interface_msg` VALUES (2, 'post', 'http://127.0.0.1:8091');
36 |
37 | -- ----------------------------
38 | -- Table structure for test_case
39 | -- ----------------------------
40 | DROP TABLE IF EXISTS `test_case`;
41 | CREATE TABLE `test_case` (
42 | `id` bigint(20) NOT NULL AUTO_INCREMENT,
43 | `case_status` int(11) NULL DEFAULT NULL,
44 | `interfacemsg_id` bigint(20) NULL DEFAULT NULL,
45 | `desc_case` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
46 | `headers_parames` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
47 | `body_parames` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
48 | `expect` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
49 | `actual` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
50 | `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
51 | PRIMARY KEY (`id`) USING BTREE
52 | ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
53 |
54 | -- ----------------------------
55 | -- Records of test_case
56 | -- ----------------------------
57 | INSERT INTO `test_case` VALUES (1, 1, 1, 'corpid/corpsecret参数均为空', '{\"Content-Type\":\"application/json\"}', '{\"corpid\":\"\",\"corpsecret\":\"\"}', '\" \"\"errcode\"\": 41004,', NULL, NULL);
58 | INSERT INTO `test_case` VALUES (2, 1, 1, 'corpid传、corpsecret为空', '{\"Content-Type\":\"application/json\"}', '{\"corpid\":\"${corpidTrue}\",\"corpsecret\":\"\"}', ' \"\"errmsg\"\": \"\"corpsecret missing\"\"\"', NULL, NULL);
59 | INSERT INTO `test_case` VALUES (3, 1, 1, 'corpid为空、corpsecret传', '{\"Content-Type\":\"application/json\"}', '{\"corpid\":\"\",\"corpsecret\":\"${corpsecretTrue}\"}', '\" \"\"errcode\"\": 41004,', NULL, NULL);
60 | INSERT INTO `test_case` VALUES (4, 1, 1, 'corpid正确传、corpsecret错误传', '{\"Content-Type\":\"application/json\"}', '{\"corpid\":\"${corpidTrue}\",\"corpsecret\":\"${corpidFalse}\"}', ' \"\"errmsg\"\": \"\"corpsecret missing\"\"', NULL, NULL);
61 | INSERT INTO `test_case` VALUES (5, 1, 1, 'corpid错误传、corpsecret正确传', '{\"Content-Type\":\"application/json\"}', '{\"corpid\":\"${corpidFalse}\",\"corpsecret\":\"${corpsecretTrue}\"}', '}\"', NULL, NULL);
62 | INSERT INTO `test_case` VALUES (6, 1, 1, 'corpid、corpsecret均错误传', '{\"Content-Type\":\"application/json\"}', '{\"corpid\":\"${corpidFalse}\",\"corpsecret\":\"${corpidFalse}\"}', '\" \"\"errcode\"\": 41002,', NULL, NULL);
63 | INSERT INTO `test_case` VALUES (7, 1, 1, 'corpid、corpsecret均正确传', '{\"Content-Type\":\"application/json\"}', '{\"corpid\":\"${corpidTrue}\",\"corpsecret\":\"${corpsecretTrue}\"}', ' \"\"errmsg\"\": \"\"corpid missing\"\"\"', NULL, NULL);
64 |
65 | -- ----------------------------
66 | -- Table structure for variable_substitution
67 | -- ----------------------------
68 | DROP TABLE IF EXISTS `variable_substitution`;
69 | CREATE TABLE `variable_substitution` (
70 | `id` bigint(20) NOT NULL AUTO_INCREMENT,
71 | `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
72 | `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
73 | `reflect_calss` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
74 | `reflect_method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
75 | `reflect_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
76 | `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
77 | PRIMARY KEY (`id`) USING BTREE
78 | ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
79 |
80 | -- ----------------------------
81 | -- Records of variable_substitution
82 | -- ----------------------------
83 | INSERT INTO `variable_substitution` VALUES (1, '${corpidTrue}', '', 'com.javaelf.dataForger.TestDataFactory', 'getCorpidTrue', 'ww27d6f876d80ceec6', '有效corpid');
84 | INSERT INTO `variable_substitution` VALUES (2, '${corpidFalse}', '', 'com.javaelf.dataForger.TestDataFactory', 'getCorpidFalse', 'ww27d6f876d80ceec', '无效corpid');
85 | INSERT INTO `variable_substitution` VALUES (3, '${corpsecretTrue}', '', 'com.javaelf.dataForger.TestDataFactory', 'getCorpsecretTrue', 'elaiRGcWe4JLESzypgnabA3Tvpj8kLiV6zLEqa4Nbw8', '有效corpsecret');
86 | INSERT INTO `variable_substitution` VALUES (4, '${corpsecretFalse}', '', 'com.javaelf.dataForger.TestDataFactory', 'getCorpsecretFalse', 'elaiRGcWe4JLESzypgnabA3Tvpj8kLiV6zLEqa4Nbw', '无效corpsecret');
87 |
88 | SET FOREIGN_KEY_CHECKS = 1;
89 |
--------------------------------------------------------------------------------
/docker-auto.sh:
--------------------------------------------------------------------------------
1 | echo "老铁我们开始吧!!!"
2 | #操作/项目路径(Dockerfile存放的路径)
3 | BASE_PATH=/work/dockerimage
4 | # 源jar路径
5 | SOURCE_PATH=/work/dockerimage/target
6 | # 项目运行jar路径
7 | PROJECT_PATH=/work/dockerimage/project
8 | # 项目备份jar路径
9 | BACKUP_PATH=/work/dockerimage/backup
10 | #docker 镜像/容器名字或者jar名字 这里都命名为这个
11 | CONTAINER_NAME=test
12 | SERVER_NAME=test-1.0-SNAPSHOT
13 | #端口映射
14 | MAIN_PORT=8090
15 | SERVER_PORT=8090
16 | #容器id
17 | CID=$(docker ps -a | grep "$CONTAINER_NAME" | awk '{print $1}')
18 | #镜像id
19 | IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
20 | DATE=`date +%Y%m%d%H%M`
21 | # 最新构建代码移动到项目环境
22 | function transfer(){
23 | echo "新构建代码$SOURCE_PATH/$SERVER_NAME.jar 移至$PROJECT_PATH ...."
24 | cp $SOURCE_PATH/$SERVER_NAME.jar $PROJECT_PATH
25 | cp $SOURCE_PATH/Dockerfile $PROJECT_PATH
26 | echo "迁移完成"
27 | }
28 | # 备份
29 | function backup(){
30 | if [ -f "$SOURCE_PATH/$SERVER_NAME.jar" ]; then
31 | echo "$SERVER_NAME.jar 备份..."
32 | cp $SOURCE_PATH/$SERVER_NAME.jar $BACKUP_PATH/$SERVER_NAME-$DATE.jar
33 | echo "备份 $SERVER_NAME.jar 完成"
34 | else
35 | echo "$SOURCE_PATH/$SERVER_NAME.jar不存在,跳过备份"
36 | fi
37 | }
38 | # 构建docker镜像
39 | function build(){
40 | if [ -n "$IID" ]; then
41 | echo "存在$SERVER_NAME镜像,IID=$IID,开始删除镜像并重新构建镜像$SERVER_NAME"
42 | docker rmi -f $SERVER_NAME
43 | else
44 | echo "不存在$SERVER_NAME镜像,开始构建镜像"
45 |
46 | fi
47 | #构建
48 | cd $PROJECT_PATH
49 | docker build --no-cache=true -t $SERVER_NAME .
50 | }
51 |
52 |
53 |
54 | GIT_USERNAME=15238305317
55 | GIT_PWD=czy
56 | GIT_PROJECT_PATH=/work/dockerimage/workspace/open-platform
57 |
58 | # 运行docker容器
59 | function run(){
60 |
61 | #自动更新git项目 expect插件安装 yum -y install expect
62 | echo "============拉取代码==========="
63 | cd $GIT_PROJECT_PATH
64 | expect -c "spawn git pull origin; expect \"*Username*\" { send \"${GIT_USERNAME}\n\"; exp_continue } \"*Password*\" { send \"${GIT_PWD}\n\" }; interact"
65 |
66 | echo "============打包tools==========="
67 | cd $GIT_PROJECT_PATH/platform-tools/
68 | mvn install
69 |
70 | echo "============打包id-server==========="
71 | cd $GIT_PROJECT_PATH/platform-id-server/
72 | mvn install
73 |
74 | echo "============打包entity-server==========="
75 | cd $GIT_PROJECT_PATH/platform-entity-server/
76 | mvn install
77 |
78 | echo "============打包pay==========="
79 | cd $GIT_PROJECT_PATH/platform-pay/
80 | mvn install
81 |
82 | echo "============复制pay==========="
83 | cp -rf target/$SERVER_NAME.jar $SOURCE_PATH
84 |
85 |
86 |
87 |
88 |
89 | #备份镜像
90 | backup
91 | #迁移(代码构建产物到运行环境)
92 | transfer
93 | #构建镜像
94 | build
95 | #删除历史缓存镜像
96 | #echo "删除历史缓存镜像"
97 | #docker images|grep none|awk '{print $3 }'|xargs docker rmi
98 |
99 | if [ -n "$CID" ]; then
100 | echo "存在$CONTAINER_NAME容器,CID=$CID,停止docker:$CONTAINER_NAME容器 ..."
101 | docker stop $CONTAINER_NAME
102 | echo "删除$CONTAINER_NAME容器"
103 | docker rm $CONTAINER_NAME
104 | echo "$CONTAINER_NAME容器清除完成"
105 | else
106 | echo "不存在$CONTAINER_NAME容器,无须清理容器..."
107 | # docker run --name $CONTAINER_NAME -v $BASE_PATH:$BASE_PATH -d -p $MAIN_PORT:$SERVER_PORT $SERVER_NAME
108 | # echo "$SERVER_NAME容器创建完成"
109 | fi
110 |
111 | echo "开始创建镜像$SERVER_NAME的容器$CONTAINER_NAME,端口映射$MAIN_PORT>>>$SERVER_PORT"
112 | docker run --name $CONTAINER_NAME -v $BASE_PATH:$BASE_PATH -d -p $MAIN_PORT:$SERVER_PORT --net=host $SERVER_NAME
113 | echo "$CONTAINER_NAME容器创建结束"
114 | docker ps
115 | #输出10分钟内的启动日志
116 | docker logs --since 10m $CONTAINER_NAME
117 | }
118 | #入口
119 | run
120 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | interface-test
8 | java-elf
9 | 1.0-SNAPSHOT
10 | java-elf接口自动化项目
11 | jar
12 |
13 |
14 | org.springframework.boot
15 | spring-boot-starter-parent
16 | 2.2.9.RELEASE
17 |
18 |
19 |
20 |
21 | org.springframework.boot
22 | spring-boot-starter
23 |
24 |
25 |
26 | org.springframework.boot
27 | spring-boot-starter-logging
28 |
29 |
30 |
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-log4j2
36 |
37 |
38 | org.springframework.boot
39 | spring-boot-starter-web
40 |
41 |
42 | org.springframework.boot
43 | spring-boot-starter-test
44 | test
45 |
46 |
47 |
48 | org.springframework.boot
49 | spring-boot-autoconfigure
50 |
51 |
52 |
53 | org.projectlombok
54 | lombok
55 | 1.18.4
56 |
57 |
58 |
59 | org.testng
60 | testng
61 | 6.14.3
62 |
63 |
64 |
65 | cn.afterturn
66 | easypoi-spring-boot-starter
67 | 4.2.0
68 |
69 |
70 | io.qameta.allure
71 | allure-testng
72 | 2.10.0
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 | commons-io
83 | commons-io
84 | 2.4
85 |
86 |
87 | cn.hutool
88 | hutool-all
89 | 5.3.5
90 |
91 |
92 | org.apache.commons
93 | commons-lang3
94 |
95 |
96 | com.google.code.gson
97 | gson
98 | 2.8.5
99 |
100 |
101 |
102 | mysql
103 | mysql-connector-java
104 | 8.0.19
105 |
106 |
107 | org.hibernate
108 | hibernate-core
109 | 5.4.15.Final
110 |
111 |
112 | org.hibernate
113 | hibernate-entitymanager
114 | 5.4.15.Final
115 |
116 |
117 | com.alibaba
118 | druid-spring-boot-starter
119 | 1.1.22
120 |
121 |
122 | org.springframework.data
123 | spring-data-jpa
124 | 2.2.0.M4
125 |
126 |
127 | org.springframework
128 | spring-test
129 | 5.2.8.RELEASE
130 |
131 |
132 | org.springframework.boot
133 | spring-boot-test
134 |
135 |
136 |
137 | com.github.javafaker
138 | javafaker
139 | 1.0.2
140 |
141 |
142 | org.apache.httpcomponents
143 | httpclient
144 | 4.5.8
145 |
146 |
147 | log4j
148 | log4j
149 | 1.2.12
150 |
151 |
152 |
153 | javax.mail
154 | mail
155 | 1.4
156 |
157 |
158 |
159 | io.springfox
160 | springfox-swagger-ui
161 | 2.9.2
162 |
163 |
164 | io.springfox
165 | springfox-swagger2
166 | 2.9.2
167 |
168 |
169 | commons-lang
170 | commons-lang
171 | 2.6
172 |
173 |
174 |
175 | com.github.mifmif
176 | generex
177 | 1.0.2
178 |
179 |
180 |
181 |
182 |
183 | org.springframework.boot
184 | spring-boot-maven-plugin
185 |
186 |
187 | org.apache.maven.plugins
188 | maven-surefire-plugin
189 | 2.22.2
190 |
191 |
192 | src/main/resources/testng.xml
193 |
194 |
195 |
196 |
197 |
198 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/JavaElfApplication.java:
--------------------------------------------------------------------------------
1 | package com.javaelf;
2 |
3 | import com.javaelf.utils.SpringContextUtil;
4 | import org.springframework.boot.SpringApplication;
5 | import org.springframework.boot.autoconfigure.SpringBootApplication;
6 | import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
7 | import org.springframework.boot.context.properties.EnableConfigurationProperties;
8 | import org.springframework.context.ApplicationContext;
9 |
10 | /**
11 | * @author czy-2020727
12 | */
13 | @EnableConfigurationProperties
14 | @SpringBootApplication(exclude = MongoAutoConfiguration.class)
15 | public class JavaElfApplication {
16 | public static void main(String[] args) {
17 | ApplicationContext context = SpringApplication.run(com.javaelf.JavaElfApplication.class, args);
18 | SpringContextUtil.setApplicationContext(context);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/base/TestBase.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.base;
2 |
3 |
4 | import org.springframework.boot.test.context.SpringBootTest;
5 | import org.springframework.stereotype.Component;
6 | import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
7 | import org.testng.annotations.AfterClass;
8 | import org.testng.annotations.BeforeClass;
9 |
10 | @Component
11 | @SpringBootTest
12 | public class TestBase extends AbstractTestNGSpringContextTests {
13 | /**
14 | * base测试类
15 | */
16 | /**
17 | * BeforeClass
18 | */
19 | @BeforeClass(alwaysRun = true)
20 | public void beforeClass() {
21 | //todo 需要执行前的操作
22 | }
23 | /**
24 | * AfterClass
25 | */
26 | @AfterClass(alwaysRun = true)
27 | public void afterClass() {
28 | //todo 执行用例后回写
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/controller/TestResultsController.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.controller;
2 |
3 | import com.javaelf.service.TestResultService;
4 | import org.springframework.beans.factory.annotation.Autowired;
5 | import org.springframework.web.bind.annotation.*;
6 |
7 | import java.util.*;
8 |
9 |
10 | /**
11 | * 测试后实际结果查询
12 | *
13 | **/
14 | @RestController
15 | @RequestMapping("/api")
16 | public class TestResultsController {
17 |
18 | @Autowired
19 | TestResultService testResultService;
20 |
21 | /**
22 | * 获取实际测试的结果--json格式
23 | *
24 | **/
25 | @PostMapping(value = "/test/actual")
26 | public List getACtual(){
27 | return testResultService.getActualTestResult();
28 | }
29 | /**
30 | * 区分必填项和非必填项
31 | * 通过组合算法动态生成参数某一必填项未传的异常测试用例
32 | *
33 | **/
34 | @PostMapping(value = "/test/mandatoryParams")
35 | public String MandatoryTest(@RequestBody String reqJson){
36 | return testResultService.mandatory(reqJson);
37 | }
38 | /**
39 | * 不区分参数的必填项和非必须
40 | * 通过组合算法动态生成参数某一填项未传的测试用例组
41 | *
42 | **/
43 | @PostMapping(value = "/test/hybridParams")
44 | public String Mandatory(@RequestBody String reqJson){
45 | return testResultService.hybrid(reqJson);
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/dao/InterfaceMsgDao.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.dao;
2 |
3 | import com.javaelf.entity.InterfaceMsg;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 | import org.springframework.stereotype.Repository;
6 |
7 | @Repository
8 | public interface InterfaceMsgDao extends JpaRepository {
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/dao/TestCaseDao.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.dao;
2 |
3 | import com.javaelf.entity.TestCase;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 | import org.springframework.data.jpa.repository.Modifying;
6 | import org.springframework.data.jpa.repository.Query;
7 | import org.springframework.data.repository.query.Param;
8 | import org.springframework.stereotype.Repository;
9 |
10 | import javax.transaction.Transactional;
11 | import java.util.List;
12 |
13 |
14 | @Repository
15 | public interface TestCaseDao extends JpaRepository {
16 | @Transactional
17 | @Modifying
18 | @Query( "UPDATE TestCase SET actual = :actual WHERE id = :id" )
19 | void updateActual(@Param( "actual" ) String actual, @Param( "id" ) Long id);
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/dao/VariableSubstitutionDao.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.dao;
2 |
3 | import com.javaelf.entity.VariableSubstitution;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 | import org.springframework.data.jpa.repository.Modifying;
6 | import org.springframework.data.jpa.repository.Query;
7 | import org.springframework.data.repository.query.Param;
8 | import org.springframework.stereotype.Repository;
9 |
10 | import javax.transaction.Transactional;
11 |
12 | @Repository
13 | public interface VariableSubstitutionDao extends JpaRepository {
14 | @Transactional
15 | @Modifying
16 | @Query( "UPDATE VariableSubstitution SET reflectValue = :reflectValue WHERE name = :variableName" )
17 | void updateVariableValue(@Param( "reflectValue" ) String reflectValue, @Param( "variableName" ) String variableName);
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/data/NumberGenerator.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.data;
2 |
3 | import java.util.Random;
4 | import java.util.concurrent.ThreadLocalRandom;
5 | import java.util.regex.Matcher;
6 | import java.util.regex.Pattern;
7 |
8 | /**
9 | * 随机数生成器
10 | *
11 | * @author niaoshuai
12 | * @author shixing
13 | */
14 | public class NumberGenerator {
15 |
16 | private static final String NUMBER_CHAR = "0123456789";
17 |
18 | /**
19 | * 生成随机数
20 | * @param length
21 | * @return
22 | */
23 | public static int randomInt(Integer length) {
24 | Random rm = new Random();
25 | if (length == 0 ){
26 | return 0;
27 | }else {
28 | int i = rm.nextInt(length);
29 | return i;
30 | }
31 | }
32 |
33 | /**
34 | * 获取指定范围随机数
35 | * @param startIndex
36 | * @param endIndex
37 | * @return
38 | */
39 | public static int randomInt(int startIndex,int endIndex ) {
40 | Random rm = new Random();
41 | int i = rm.nextInt(endIndex+1-startIndex)+startIndex;
42 | return i;
43 | }
44 |
45 |
46 | /**
47 | * @Author zgq
48 | * @Description 生成有序的编号 0000 前缀长度
49 | * @Date 20-9-24 下午4:49
50 | * @param endIndex
51 | * @return java.lang.String
52 | **/
53 | public static String orderInt(int endIndex) {
54 | String result="";
55 | for (int i = 1; i <= endIndex; i++) {
56 | if (i < 10) {
57 | result = "000" + i;
58 | System.out.println(result);
59 | } else if (i >= 100) {
60 | result = "000" + i;
61 | System.out.println(result);
62 | } else if (i >= 1000) {
63 | result = "000" + i;
64 | System.out.println(result);
65 | } else if (i >= 10000) {
66 | // result = String(int);
67 | System.out.println(i);
68 | } else
69 | { System.out.println("0000" + i);
70 | }
71 | }
72 | return result ;
73 | }
74 |
75 | /**
76 | * @Author zgq
77 | * @Description 生成规则设备编号:设备类型+五位编号(从1开始,不够前补0)
78 | * @Date 20-9-24 下午5:24
79 | * @param equipmentType
80 | * @param equipmentNo
81 | * @return java.lang.String
82 | **/
83 | public static String getNewEquipmentNo(String equipmentType, String equipmentNo){
84 | String newEquipmentNo = "";
85 |
86 | if(equipmentNo != null && !equipmentNo.isEmpty()){
87 | int newEquipment = Integer.parseInt(equipmentNo) + 1;
88 | newEquipmentNo = String.format(equipmentType + "%05d", newEquipment);
89 | }
90 | return newEquipmentNo;
91 | }
92 |
93 |
94 |
95 | public static String generateStringByLength(int length) {
96 | StringBuffer sb = new StringBuffer();
97 | Random random = new Random();
98 | for (int i = 0; i < length; i++) {
99 | sb.append(NUMBER_CHAR.charAt(random.nextInt(NUMBER_CHAR.length())));
100 | }
101 | return sb.toString();
102 | }
103 |
104 | public static final char[] CHARR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~!@#$%^&*.?-+=_".toCharArray();
105 | public static final String PASSWORD_REGEX = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\\W_!@#$%^&*`~()-+=]+$)(?![0-9\\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]{8,16}$";
106 | public static final String NO_CHINESE_REGEX = "^[^\\u4e00-\\u9fa5]+$";
107 | public static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX);
108 | public static final Pattern NO_CHINESE_PATTERN = Pattern.compile(NO_CHINESE_REGEX);
109 | /**
110 | * 生成密码
111 | * @param length
112 | * @return
113 | */
114 | public static String generatePassword(int length) {
115 | length = length < 6 ? 6 : length;
116 | length = length > 16 ? 16 : length;
117 | String result = getRandomPassword(length);
118 | Matcher m = PASSWORD_PATTERN.matcher(result);
119 | Matcher m1 = NO_CHINESE_PATTERN.matcher(result);
120 | if (m.matches() && m1.matches()) {
121 | return result;
122 | }
123 | return generatePassword(length);
124 | }
125 |
126 | public static String getRandomPassword(int length) {
127 | StringBuilder sb = new StringBuilder();
128 | ThreadLocalRandom r = ThreadLocalRandom.current();
129 | for (int i = 0; i < length; i++) {
130 | sb.append(CHARR[r.nextInt(CHARR.length)]);
131 | }
132 | return sb.toString();
133 | }
134 |
135 | }
136 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/data/RandomGenerator.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.data;
2 |
3 | import java.util.Random;
4 |
5 | public class RandomGenerator {
6 |
7 | public static boolean getRandomBoolean() {
8 | Random random = new Random();
9 | return random.nextBoolean();
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/dataForger/TestDataFactory.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.dataForger;
2 |
3 | import com.github.javafaker.Faker;
4 | import org.springframework.stereotype.Component;
5 | import org.testng.annotations.Test;
6 |
7 | import java.util.Locale;
8 |
9 |
10 | /**
11 | * 数据工厂伪造者,可以提供测试数据工厂数据:常用的姓名、电话号码、地址、随机数等
12 | */
13 | @Component
14 | public class TestDataFactory {
15 |
16 | /**
17 | * 企业微信测试数据工厂
18 | */
19 | //企业ID-正确
20 | public String getCorpidTrue(){
21 | String corpid = "ww27d6f876d80ceec6";
22 | return corpid;
23 | }
24 |
25 | //应用的凭证密钥-正确
26 | public String getCorpsecretTrue(){
27 | String corpsecret = "elaiRGcWe4JLESzypgnabA3Tvpj8kLiV6zLEqa4Nbw8";
28 | return corpsecret;
29 | }
30 | //企业ID-错误
31 | public String getCorpidFalse(){
32 | String corpid = "ww27d6f876d80ceec";
33 | return corpid;
34 | }
35 |
36 | //应用的凭证密钥-错误
37 | public String getCorpsecretFalse(){
38 | String corpsecret = "elaiRGcWe4JLESzypgnabA3Tvpj8kLiV6zLEqa4Nbw";
39 | return corpsecret;
40 | }
41 | /***
42 | * 初始Faker对象,并使用CHINA信息
43 | */
44 | Faker faker = new Faker(new Locale("zh-CN"));
45 | public String getName(){
46 | String name = faker.phoneNumber().cellPhone();
47 | return name;
48 | }
49 | @Test
50 | public void tt(){
51 |
52 | System.out.println(getName());
53 | }
54 |
55 |
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/entity/InterfaceMsg.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.entity;
2 |
3 | import cn.afterturn.easypoi.excel.annotation.Excel;
4 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
5 | import lombok.Getter;
6 | import lombok.Setter;
7 | import org.hibernate.annotations.DynamicInsert;
8 | import org.hibernate.annotations.DynamicUpdate;
9 |
10 | import javax.persistence.*;
11 | import javax.validation.constraints.NotBlank;
12 |
13 | /**
14 | *
15 | *URL访问路径 --PO(Persistent Object):持久化对象
16 | *
17 | *@author CZY
18 | *@date 2020-5-31 13:43:37
19 | **/
20 | @Setter
21 | @Getter
22 | @Entity
23 | @Table(name = "interfaceMsg")
24 | @JsonIgnoreProperties(value={"hibernateLazyInitializer","handler"})
25 | @DynamicInsert
26 | @DynamicUpdate
27 | public class InterfaceMsg {
28 | private static final long serialVersionUID = 1L;
29 | /**
30 | * url的id
31 | */
32 | @GeneratedValue(strategy= GenerationType.IDENTITY)
33 | @NotBlank(message = "id不能为空")
34 | @Id
35 | private Long id;
36 | /**
37 | * 请求类型:get/post/put/delete/update
38 | */
39 | @NotBlank(message = "请求类型不能为空")
40 | private String requestType ;
41 | /**
42 | * 请求地址address
43 | */
44 | @NotBlank(message = "url地址不能为空")
45 | private String urlAddress;
46 | /**
47 | * 请求参数
48 | */
49 | private String params;
50 | /**
51 | * 备注信息
52 | */
53 | private String remark;
54 |
55 | }
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/entity/InterfaceMsg_.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.entity;
2 |
3 | import javax.persistence.metamodel.SingularAttribute;
4 | import javax.persistence.metamodel.StaticMetamodel;
5 |
6 | /**
7 | *被测url信息 --实体类校验
8 | *
9 | *@author czy
10 | *@date 2020-5-31 13:43:37
11 | **/
12 | @StaticMetamodel(InterfaceMsg.class)
13 | public class InterfaceMsg_ {
14 | public static volatile SingularAttribute id;
15 | public static volatile SingularAttribute requestType;
16 | public static volatile SingularAttribute urlAddress;
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/entity/TestCase.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.entity;
2 |
3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 | import org.hibernate.annotations.DynamicInsert;
7 | import org.hibernate.annotations.DynamicUpdate;
8 |
9 | import javax.persistence.*;
10 | import javax.validation.constraints.NotBlank;
11 |
12 | /**
13 | *
14 | *测试用例 --PO(Persistent Object):持久化对象
15 | *
16 | *@author CZY
17 | *@date 2020-5-31 13:43:37
18 | **/
19 | @Setter
20 | @Getter
21 | @Entity
22 | @Table(name = "testCase")
23 | @JsonIgnoreProperties(value={"hibernateLazyInitializer","handler"})
24 | @DynamicInsert
25 | @DynamicUpdate
26 | public class TestCase {
27 | private static final long serialVersionUID = 1L;
28 | /**
29 | * url的id
30 | */
31 | @GeneratedValue(strategy= GenerationType.IDENTITY)
32 | @NotBlank(message = "id不能为空")
33 | @Id
34 | private Long id;
35 | /**
36 | * 绑定状态 0 正向测试 1 反向测试
37 | */
38 | private Integer caseStatus;
39 | /**
40 | * 接口信息对应的id
41 | */
42 | private Long interfacemsgId ;
43 | /**
44 | * 用例描述
45 | */
46 | private String descCase;
47 | /**
48 | * 请求头参数
49 | */
50 | private String headersParames;
51 | /**
52 | * 请求体参数
53 | */
54 | private String bodyParames;
55 | /**
56 | * 期望结果
57 | */
58 | private String expect;
59 | /**
60 | * 实际响应结果
61 | */
62 | private String actual;
63 | /**
64 | * 备注信息
65 | */
66 | private String remark;
67 |
68 | }
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/entity/TestCase_.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.entity;
2 |
3 |
4 | import javax.persistence.metamodel.SingularAttribute;
5 | import javax.persistence.metamodel.StaticMetamodel;
6 |
7 | /**
8 | *被测url信息 --实体类校验
9 | *
10 | *@author czy
11 | *@date 2020-5-31 13:43:37
12 | **/
13 | @StaticMetamodel(TestCase.class)
14 | public class TestCase_ {
15 | public static volatile SingularAttribute id;
16 | public static volatile SingularAttribute caseStatus;
17 | public static volatile SingularAttribute interfacemsgId;
18 | public static volatile SingularAttribute headersParames;
19 | public static volatile SingularAttribute bodyParames;
20 | public static volatile SingularAttribute expect;
21 | public static volatile SingularAttribute actual;
22 | public static volatile SingularAttribute remark;
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/entity/TestStreamEntity.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.entity;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 | import lombok.ToString;
7 |
8 | /**
9 | * stream流的测试类-学习stream流使用,不做其他用途
10 | * */
11 | @Getter
12 | @Setter
13 | @AllArgsConstructor
14 | @ToString
15 | public class TestStreamEntity {
16 | /**
17 | * 姓名
18 | * */
19 | public String name;
20 | /**
21 | * 性别
22 | * */
23 | public String sex;
24 | /**
25 | * 年龄
26 | * */
27 | public int age;
28 | /**
29 | * 年级
30 | * */
31 | public int grade;
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/entity/VariableSubstitution.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.entity;
2 |
3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 | import org.hibernate.annotations.DynamicInsert;
7 | import org.hibernate.annotations.DynamicUpdate;
8 | import org.hibernate.validator.constraints.Length;
9 |
10 | import javax.persistence.*;
11 | import javax.validation.constraints.NotBlank;
12 |
13 | @Setter
14 | @Getter
15 | @Entity
16 | @Table(name = "variableSubstitution")
17 | @JsonIgnoreProperties(value={"hibernateLazyInitializer","handler"})
18 | @DynamicInsert
19 | @DynamicUpdate
20 | public class VariableSubstitution {
21 | private static final long serialVersionUID = 1L;
22 | /**
23 | * url的id
24 | */
25 | @GeneratedValue(strategy= GenerationType.IDENTITY)
26 | @NotBlank(message = "id不能为空")
27 | @Id
28 | private Long id;
29 | /**
30 | * 变量名
31 | */
32 | @NotBlank(message = "变量名不能为空")
33 | @Length(max = 32,message = "最大32位")
34 | @Column(nullable = false,length = 32)
35 | private String name;
36 | /**
37 | * 变量值
38 | */
39 | private String value;
40 | /**
41 | * 反射的类名
42 | */
43 | private String reflectCalss;
44 | /**
45 | * 反射类的方法
46 | */
47 | private String reflectMethod;
48 | /**
49 | * 反射方法返回的值
50 | */
51 | private String reflectValue;
52 | /**
53 | * 备注信息
54 | */
55 | private String remark;
56 | }
57 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/entity/VariableSubstitution_.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.entity;
2 |
3 | import javax.persistence.metamodel.SingularAttribute;
4 | import javax.persistence.metamodel.StaticMetamodel;
5 |
6 | @StaticMetamodel( VariableSubstitution.class)
7 | public class VariableSubstitution_ {
8 | public static volatile SingularAttribute id;
9 | public static volatile SingularAttribute name;
10 | public static volatile SingularAttribute value;
11 | public static volatile SingularAttribute reflectCalss;
12 | public static volatile SingularAttribute reflectMethod;
13 | public static volatile SingularAttribute reflectValue;
14 | public static volatile SingularAttribute remark;
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/listener/AssertListener.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.listener;
2 |
3 | import com.javaelf.utils.AssertionOverrideUtil;
4 | import org.testng.ITestResult;
5 | import org.testng.TestListenerAdapter;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | /**
11 | * 集成allure报告
12 | *
13 | * @author czy
14 | * @date 2020/7/15
15 | */
16 | public class AssertListener extends TestListenerAdapter {
17 |
18 | @Override
19 | public void onTestStart(ITestResult result) {
20 | AssertionOverrideUtil.flag = true;
21 | AssertionOverrideUtil.errors.clear();
22 | }
23 |
24 | @Override
25 | public void onTestFailure(ITestResult tr) {
26 | this.handleAssertion(tr);
27 | }
28 |
29 | @Override
30 | public void onTestSkipped(ITestResult tr) {
31 | this.handleAssertion(tr);
32 | }
33 |
34 | @Override
35 | public void onTestSuccess(ITestResult tr) {
36 | this.handleAssertion(tr);
37 | }
38 |
39 | private int index = 0;
40 |
41 | private void handleAssertion(ITestResult tr){
42 | if(!AssertionOverrideUtil.flag){
43 | Throwable throwable = tr.getThrowable();
44 | if(throwable==null){
45 | throwable = new Throwable();
46 | }
47 | StackTraceElement[] traces = throwable.getStackTrace();
48 | StackTraceElement[] alltrace = new StackTraceElement[0];
49 | for (Error e : AssertionOverrideUtil.errors) {
50 | StackTraceElement[] errorTraces = e.getStackTrace();
51 | StackTraceElement[] et = this.getKeyStackTrace(tr, errorTraces);
52 | StackTraceElement[] message = new StackTraceElement[]{new StackTraceElement("message : "+e.getMessage()+" in method : ", tr.getMethod().getMethodName(), tr.getTestClass().getRealClass().getSimpleName(), index)};
53 | index = 0;
54 | alltrace = this.merge(alltrace, message);
55 | alltrace = this.merge(alltrace, et);
56 | }
57 | if(traces!=null){
58 | traces = this.getKeyStackTrace(tr, traces);
59 | alltrace = this.merge(alltrace, traces);
60 | }
61 | throwable.setStackTrace(alltrace);
62 | tr.setThrowable(throwable);
63 | AssertionOverrideUtil.flag = true;
64 | AssertionOverrideUtil.errors.clear();
65 | tr.setStatus(ITestResult.FAILURE);
66 | }
67 | }
68 |
69 | private StackTraceElement[] getKeyStackTrace(ITestResult tr, StackTraceElement[] stackTraceElements){
70 | List ets = new ArrayList();
71 | for (StackTraceElement stackTraceElement : stackTraceElements) {
72 | if(stackTraceElement.getClassName().equals(tr.getTestClass().getName())){
73 | ets.add(stackTraceElement);
74 | index = stackTraceElement.getLineNumber();
75 | }
76 | }
77 | StackTraceElement[] et = new StackTraceElement[ets.size()];
78 | for (int i = 0; i < et.length; i++) {
79 | et[i] = ets.get(i);
80 | }
81 | return et;
82 | }
83 |
84 | private StackTraceElement[] merge(StackTraceElement[] traces1, StackTraceElement[] traces2){
85 | StackTraceElement[] ste = new StackTraceElement[traces1.length+traces2.length];
86 | for (int i = 0; i < traces1.length; i++) {
87 | ste[i] = traces1[i];
88 | }
89 | for (int i = 0; i < traces2.length; i++) {
90 | ste[traces1.length+i] = traces2[i];
91 | }
92 | return ste;
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/service/TestResultService.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.service;
2 |
3 |
4 | import org.springframework.stereotype.Service;
5 |
6 | import java.util.List;
7 |
8 | @Service
9 | public interface TestResultService {
10 | /**
11 | * 获取实际测试结果
12 | *
13 | * @return
14 | */
15 | List getActualTestResult();
16 | /**
17 | * 动态生成必填项未传异常测试用例集
18 | *
19 | * @return
20 | */
21 | String mandatory(String reqJson);
22 | /**
23 | * 动态生成混合参数的测试用例集
24 | *
25 | * @return
26 | */
27 | String hybrid(String reqJson);
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/service/impl/JpaWXCaseService.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.service.impl;
2 |
3 | import com.javaelf.dao.InterfaceMsgDao;
4 | import com.javaelf.dao.TestCaseDao;
5 | import com.javaelf.dao.VariableSubstitutionDao;
6 | import com.javaelf.entity.InterfaceMsg;
7 | import com.javaelf.entity.TestCase;
8 | import com.javaelf.entity.VariableSubstitution;
9 | import com.javaelf.utils.AssertionOverrideUtil;
10 | import com.javaelf.utils.JsonUtils;
11 | import com.javaelf.utils.RestTemplateUtils;
12 | import com.javaelf.utils.VariableUtil;
13 | import io.qameta.allure.Allure;
14 | import io.qameta.allure.model.Status;
15 | import org.springframework.beans.factory.annotation.Autowired;
16 | import org.springframework.stereotype.Component;
17 |
18 | import java.util.*;
19 |
20 | @Component
21 | public class JpaWXCaseService {
22 | @Autowired
23 | private InterfaceMsgDao interfaceMsgDao;
24 | @Autowired
25 | private TestCaseDao testCaseDao;
26 | @Autowired
27 | private VariableSubstitutionDao variableSubstitutionDao;
28 |
29 | public void getToken() {
30 | List interfaceMsgList = interfaceMsgDao.findAll();
31 | List testCaseList = testCaseDao.findAll();
32 | List variableSubstitutionList = variableSubstitutionDao.findAll();
33 | List responseList = new ArrayList<>();
34 | for (InterfaceMsg interfaceMsg : interfaceMsgList) {
35 | if (interfaceMsg.getId() != null) {
36 | for (TestCase testCase : testCaseList) {
37 | String parames = testCase.getBodyParames();
38 | if (testCase.getInterfacemsgId().equals(interfaceMsg.getId())) {
39 | if (testCase.getInterfacemsgId().equals(interfaceMsg.getId())) {
40 | //调用工具类把body的变量名替换为变量值并写入数据库中
41 | parames = VariableUtil.replaceVariables(parames, variableSubstitutionList,variableSubstitutionDao);
42 | //请求参数写入到allure报告中
43 | Allure.addAttachment("Request", parames);
44 | Map paramesVariableValueMap = JsonUtils.json2map(parames);
45 | //get请求拼接
46 | String url = interfaceMsg.getUrlAddress();
47 | url = url + "?corpid=" + paramesVariableValueMap.get("corpid") + "&corpsecret=" + paramesVariableValueMap.get("corpsecret");
48 | String response = RestTemplateUtils.get(url, String.class).getBody();
49 | System.out.println(response);
50 | //预期结果断言
51 | Map assertExpectMap = JsonUtils.json2map(response);
52 | int expected = (int) assertExpectMap.get("errcode");
53 | if (expected == 0) {
54 | Allure.step("测试通过!---这是预期的成功", Status.PASSED);
55 | //响应结果写入allure报告中
56 | Allure.addAttachment("Response", response);
57 | } else {
58 | Allure.step("测试通过!---这是预期的失败", Status.FAILED);
59 | //响应结果写入allure报告中
60 | Allure.addAttachment("Response", response);
61 | }
62 | AssertionOverrideUtil.verifyEquals(expected, 0);
63 | //区分测试类型0是正向,1是反向
64 | if (testCase.getCaseStatus()==0){
65 | response = "正向测试响应结果----- : "+response;
66 | }else {
67 | response = "反向测试响应结果----- : "+ response;
68 | }
69 | //获取响应结果更新数据库
70 | testCaseDao.updateActual(response, testCase.getId());
71 | }
72 | }
73 | }
74 | }
75 | }
76 | }
77 |
78 | }
79 |
--------------------------------------------------------------------------------
/src/main/java/com/javaelf/service/impl/TestResultServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.javaelf.service.impl;
2 |
3 | import com.javaelf.dao.TestCaseDao;
4 | import com.javaelf.entity.TestCase;
5 | import com.javaelf.service.TestResultService;
6 | import com.javaelf.utils.JsonUtils;
7 | import org.apache.commons.lang.StringEscapeUtils;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.stereotype.Service;
10 | import org.testng.annotations.Test;
11 |
12 |
13 | import java.util.*;
14 | import java.util.stream.Collectors;
15 |
16 | @Service
17 | public class TestResultServiceImpl implements TestResultService {
18 |
19 | @Autowired
20 | TestCaseDao testCaseDao;
21 |
22 | /**
23 | * 查询实际执行测试用例的结果
24 | *
25 | * */
26 | @Override
27 | public List getActualTestResult() {
28 | List testCases = testCaseDao.findAll();
29 | List getActual = new ArrayList<>();
30 | for (TestCase testCase : testCases){
31 | getActual.add(testCase.getActual());
32 | }
33 | return getActual;
34 | }
35 | /**
36 | * 必填项未传的用例组合---根据参数必填项某一个未传+非必传参数,组合生成新的请求参数用例
37 | *
38 | *
39 | * @return*/
40 | public String mandatory(String reqJson) {
41 | Map map = JsonUtils.json2map(reqJson);
42 | Map yesMap = (Map) map.get("yes");
43 | Map noMap = (Map) map.get("no");
44 | Set set = yesMap.keySet();
45 | List