Commit 6acdd168 authored by 郭姣's avatar 郭姣

卡卡

parents
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/yep.iml" filepath="$PROJECT_DIR$/.idea/yep.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
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
# kejiji
apply plugin: 'java'
apply plugin: 'maven'
group = 'kjj'
version = '1.0-SNAPSHOT'
description = """"""
sourceCompatibility = 1.8
targetCompatibility = 1.8
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
repositories {
mavenLocal()
maven { url "http://nexus.dui88.com:8081/nexus/content/groups/public/" }
maven { url "https://plugins.gradle.org/m2/" } //sonarqube
maven { url "http://repo.spring.io/plugins-release" }
mavenCentral()
}
dependencies {
compile 'org.projectlombok:lombok:1.18.12'
compile 'org.java-websocket:Java-WebSocket:1.5.1'
annotationProcessor 'org.projectlombok:lombok:1.18.12'
testCompile 'org.projectlombok:lombok:1.18.12'
testCompile 'org.java-websocket:Java-WebSocket:1.5.1'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.12'
compile group: 'com.alibaba', name: 'fastjson', version:'1.2.58'
compile(group: 'commons-lang', name: 'commons-lang', version:'2.6') {
exclude(module: 'commons-logging')
}
compile group: 'mysql', name: 'mysql-connector-java', version:'8.0.15'
compile group: 'org.apache.poi', name: 'poi', version:'4.1.0'
compile group: 'org.apache.poi', name: 'poi-ooxml', version:'3.17'
compile group: 'com.relevantcodes', name: 'extentreports', version:'2.41.0'
compile group: 'com.vimalselvam', name: 'testng-extentsreport', version:'1.3.1'
compile group: 'com.aventstack', name: 'extentreports', version:'3.0.6'
compile group: 'com.google.inject', name: 'guice', version:'4.2.2'
testCompile group: 'org.testng', name: 'testng', version:'6.8.8'
testCompile group: 'io.rest-assured', name: 'rest-assured', version:'4.0.0'
}
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="TEST" name="Maven: org.testng:testng:6.8.8" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.beanshell:bsh:2.0b4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.beust:jcommander:1.27" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.58" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: io.rest-assured:rest-assured:4.0.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.codehaus.groovy:groovy:2.5.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.codehaus.groovy:groovy-xml:2.5.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.6" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:2.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:2.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ccil.cowan.tagsoup:tagsoup:1.2.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: io.rest-assured:json-path:4.0.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.codehaus.groovy:groovy-json:2.5.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: io.rest-assured:rest-assured-common:4.0.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: io.rest-assured:xml-path:4.0.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.commons:commons-lang3:3.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: javax.xml.bind:jaxb-api:2.2.12" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.sun.xml.bind:jaxb-osgi:2.2.10" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.sling:org.apache.sling.javax.activation:0.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: javax.activation:activation:1.1.1" level="project" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.15" level="project" />
<orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi:4.1.0" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.12" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" />
<orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" />
<orderEntry type="library" name="Maven: org.java-websocket:Java-WebSocket:1.5.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
<orderEntry type="library" name="Maven: com.relevantcodes:extentreports:2.41.0" level="project" />
<orderEntry type="library" name="Maven: org.jsoup:jsoup:1.8.3" level="project" />
<orderEntry type="library" name="Maven: org.xerial:sqlite-jdbc:3.8.11.1" level="project" />
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.23" level="project" />
<orderEntry type="library" name="Maven: org.mongodb:mongodb-driver:3.0.4" level="project" />
<orderEntry type="library" name="Maven: org.mongodb:bson:3.0.4" level="project" />
<orderEntry type="library" name="Maven: org.mongodb:mongodb-driver-core:3.0.4" level="project" />
<orderEntry type="library" name="Maven: com.vimalselvam:testng-extentsreport:1.3.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
<orderEntry type="library" name="Maven: com.aventstack:extentreports:3.0.6" level="project" />
<orderEntry type="library" name="Maven: com.google.inject:guice:4.2.2" level="project" />
<orderEntry type="library" name="Maven: javax.inject:javax.inject:1" level="project" />
<orderEntry type="library" name="Maven: aopalliance:aopalliance:1.0" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.12" level="project" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>kjj</groupId>
<artifactId>kjj</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- maven 参数配置,这里引用不同的testng.xml -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- maven 引用依赖不同的jar -->
<dependencies>
<!--导入TestNG依赖包-->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.8</version>
<scope>test</scope>
</dependency>
<!-- 导入fastjson包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<!-- rest-assured -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.0.0</version>
<scope>test</scope>
</dependency>
<!-- 导入commons-lang的jar包 -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- 引入poi,解析workbook视图 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.1</version>
</dependency>
<!-- 依赖reportNg 关联testNg-->
<!-- <dependency>-->
<!-- <groupId>org.uncommons</groupId>-->
<!-- <artifactId>reportng</artifactId>-->
<!-- <version>1.1.4</version>-->
<!-- <scope>test</scope>-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>org.testng</groupId>-->
<!-- <artifactId>testng</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
<!-- ExtentReports测试报告 关联testNg-->
<dependency>
<groupId>com.relevantcodes</groupId>
<artifactId>extentreports</artifactId>
<version>2.41.0</version>
</dependency>
<dependency>
<groupId>com.vimalselvam</groupId>
<artifactId>testng-extentsreport</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
<!-- 编译插件 -->
<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<encoding>utf-8</encoding>
<!--源代码的编译-->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
<suiteXmlFiles>
<suiteXmlFile>src/test/testNG.xml</suiteXmlFile>
</suiteXmlFiles>
<properties>
<!--即使测试失败,也继续下面的测试-->
<property>
<name>usedefaultlisteners</name>
<value>false</value>
</property>
<property>
<name>listener</name>
<value>com.oto.config.ExtentTestNGIReporterListener</value>
</property>
</properties>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
rootProject.name = 'kjj'
package com.oto.cases.admin;
import com.oto.utils.NetworkUtils;
import static com.oto.config.BasicConfig.*;
import static com.oto.utils.BaseUtils.*;
/**
* 管理员授权
* @author 吉吉,ID:907
*/
public interface Authorization {
NetworkUtils network = NetworkUtils.getInstance();
//oto销售工作台-销售
default void otosellerAuth() {
network.agentCookies.put(otoSellerCookieKey, otoSellerCookieValue);
}
//oto销售工作台-总监
default void otoLeaderAuth() {
network.agentCookies.put(otoLeaderCookieKey, otoLeaderCookieValue);
}
//oto销售工作台手机端-销售
default void otoSellerTku() {
network.agentCookies.put("tku", OTO_TKU);
}
//oto销售工作台-管理员
default void otoManagerAuth() {
network.agentCookies.put(otoManagerCookieKey, otoManagerCookieValue);
}
//久久保管理员-正常权限模式
default void jjbManagerAuth() {network.agentCookies.put(JJBManagerCookieKey,JJBManagerCookieValue);}
/**
* 集客助手相关授权
*/
//代理人吉吉 sid:2991
default void agentTku() {
network.agentCookies.put(TKU_COOKIE_NAME, AGENT_TKU);
System.out.println("代理人吉吉tku:" + AGENT_TKU);
}
//代理人xxx
default void agent2Tku() {
network.agentCookies.put(TKU_COOKIE_NAME, AGENT2_TKU);
System.out.println("代理人梦晨tku:" + AGENT2_TKU);
}
}
package com.oto.cases.otoseller;
import com.oto.cases.admin.Authorization;
import com.oto.config.BasicConfig;
import com.oto.utils.NetworkUtils;
import io.restassured.response.Response;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.text.SimpleDateFormat;
import java.util.*;
import static com.oto.utils.BaseUtils.JJBLogin;
public class JiuJiuBao implements Authorization {
private static final NetworkUtils network = NetworkUtils.getInstance();
public int isApproveId; //入职审批id
public int sellerListSize; //入职审批个数
public int jjbSellerId; //久久保销售id
public int leaveTotalCount; //离职审批列表的数目
public int leaveIsApproveId; //离职审批id
public String phoneNumber; //销售手机号
public int detailId; //销售信息id
@BeforeTest
public void setup(){
JJBLogin();
}
@Test(description = "获取销售信息维护列表",priority = 1)
public void 获取销售信息维护列表(){
Map<String,Object> params = new HashMap<>();
params.put("pageIndex",1);
params.put("pageSize","50");
Response response = network.getResponse(params,BasicConfig.JiuJiuBao_sellerList);
Object data = response.jsonPath().getJsonObject("data");
Assert.assertNotNull(data,network.message(params,BasicConfig.JiuJiuBao_sellerList,"获取销售信息维护列表失败",response.body().asString()));
sellerListSize = response.jsonPath().getInt("data.totalCount");
}
@Test(description = "保存入职信息",priority =2)
public void 保存入职信息(){
Map<String,Object> params = new HashMap<>();
params.put("bankAccount",1);
params.put("bankAccountNumber","1111111111111111111");
params.put("birthTime",System.currentTimeMillis());
params.put("certificateNumber","1234");
params.put("certificateType","passport");//护照
params.put("companyId",5);
List listCon = new ArrayList();
listCon.add("//yun.dui88.com/kjy/media/file/20220629/b87f8de281d7daa7b1df767a71692ee0.jpeg");
params.put("contractSign",listCon);//一寸照片
List listDip = new ArrayList();
listDip.add("//yun.dui88.com/kjy/media/file/20220629/70acebbcde2089f66b2c998f850afeb6.jpg");
params.put("diploma",listDip);
params.put("homeAddress","浙江省杭州市西湖区兑吧集团");
params.put("inductionTime",System.currentTimeMillis());
params.put("leaveOfEducation",2);//类型是硕士
params.put("nation",3);//民族是蒙古族
params.put("oneInchPhoto","//yun.dui88.com/kjy/media/file/20220629/ee3596b2606f4ef8c41360a55b5c8001.jpg");
//拼接手机号
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
String num = df.format(new Date());
phoneNumber = "151" + num;
params.put("phoneNumber",phoneNumber);
params.put("politicCountenance",1);//政治面貌 1:中共党员
params.put("roleType",1);//角色 1:普通销售
params.put("sellerGender",1);//性别
params.put("sellerLevel",1);
params.put("sellerName","自动化久久保");
params.put("sellerType","autarky");//销售类型 autarky:久久保自营销售 depend_on:挂靠销售 orther_autarky:自营其他销售
params.put("serialNumber","12332");
params.put("signedType","labour_service");//签约类型:labour_service 劳务合同 labour 劳动合同
Response response = network.postResponse(params, BasicConfig.JiuJiuBao_auditSave);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_auditSave,"保存入职信息失败",response.body().asString()));
}
@Test(description = "查询保存的入职信息",priority =3)
public void 查询保存的入职信息(){
Response response = network.getResponse(BasicConfig.JiuJiuBao_auditSubmitDetail);
Object data = response.jsonPath().getJsonObject("data");
Assert.assertNotNull(data,network.message(BasicConfig.JiuJiuBao_auditSubmitDetail,"查看入职信息失败",response.body().asString()));
//获取销售信息id
detailId = response.jsonPath().getInt("data.id");
}
@Test(description = "提交入职信息",priority =4)
public void 提交入职信息(){
Map<String,Object> params = new HashMap<>();
params.put("bankAccount",1);
params.put("bankAccountNumber","1111111111111111111");
params.put("birthTime",System.currentTimeMillis());
params.put("certificateNumber","1234");
params.put("certificateType","passport");//护照
params.put("companyId",5);
List listCon = new ArrayList();
listCon.add("//yun.dui88.com/kjy/media/file/20220629/b87f8de281d7daa7b1df767a71692ee0.jpeg");
params.put("contractSign",listCon);//一寸照片
List listDip = new ArrayList();
listDip.add("//yun.dui88.com/kjy/media/file/20220629/70acebbcde2089f66b2c998f850afeb6.jpg");
params.put("diploma",listDip);
params.put("homeAddress","浙江省杭州市西湖区兑吧集团");
params.put("id",detailId);
params.put("inductionTime",System.currentTimeMillis());
params.put("leaveOfEducation",2);//类型是硕士
params.put("nation",1);//民族是汉族
params.put("oneInchPhoto","//yun.dui88.com/kjy/media/file/20220629/ee3596b2606f4ef8c41360a55b5c8001.jpg");
params.put("phoneNumber",phoneNumber);
params.put("politicCountenance",1);//政治面貌 1:中共党员
params.put("roleType",1);//角色 1:普通销售
params.put("sellerGender",1);//性别
params.put("sellerLevel",1);
params.put("sellerName","自动化久久保");
params.put("sellerType","autarky");//销售类型 autarky:久久保自营销售 depend_on:挂靠销售 orther_autarky:自营其他销售
params.put("serialNumber","12332");
params.put("signedType","labour_service");//签约类型:labour_service 劳务合同 labour 劳动合同
Response response = network.postResponse(params, BasicConfig.JiuJiuBao_auditSubmit);
String data = response.jsonPath().getString("data");
Assert.assertNotNull(data,network.message(params,BasicConfig.JiuJiuBao_auditSubmit,"提交入职信息失败",response.body().asString()));
}
@Test(description = "获取入职审批列表",priority = 5)
public void 获取入职审批列表(){
Map<String,Object> params = new HashMap<>();
params.put("auditType",1);
params.put("pageIndex",1);
params.put("pageSize",50);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_auditList);
Object data = response.jsonPath().getJsonObject("data");
Assert.assertNotNull(data,network.message(params,BasicConfig.JiuJiuBao_auditList,"获取入职审批列表失败",response.body().asString()));
//获取入职审批id
isApproveId = response.jsonPath().getInt("data.list[0].id");
}
@Test(description = "入职审批通过",priority = 6)
public void 入职审批通过(){
Map<String,Object> params = new HashMap<>();
params.put("auditFlag",1);
params.put("id",isApproveId);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_auditIsApprove);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_auditIsApprove,"入职审批通过失败",response.body().asString()));
//校验销售信息维护页数据增加1
params.clear();
params.put("pageIndex",1);
params.put("pageSize","50");
Response listSizeRes = network.getResponse(params,BasicConfig.JiuJiuBao_sellerList);
int sellerListSizeNew = listSizeRes.jsonPath().getInt("data.totalCount");
Assert.assertTrue(sellerListSizeNew>sellerListSize,network.message(params,BasicConfig.JiuJiuBao_sellerList,"入职审批失败",listSizeRes.body().asString()));
//获取新增的销售id
jjbSellerId = listSizeRes.jsonPath().getInt("data.list[0].id");
}
@Test(description = "编辑销售信息",priority = 7)
public void 编辑销售信息(){
Map<String,Object> params = new HashMap();
params.put("bankAccount",2);
params.put("bankAccountNumber","1111111111111111111");
params.put("companyId",5);
List listCon = new ArrayList();
listCon.add("//yun.dui88.com/kjy/media/file/20220629/b87f8de281d7daa7b1df767a71692ee0.jpeg");
params.put("contractSign",listCon);//一寸照片
List listDip = new ArrayList();
listDip.add("//yun.dui88.com/kjy/media/file/20220629/70acebbcde2089f66b2c998f850afeb6.jpg");
params.put("diploma",listDip);
params.put("homeAddress","浙江省杭州市西湖区兑吧集团11");
params.put("id",jjbSellerId);
params.put("leaveOfEducation",2);
params.put("nation",1);
params.put("oneInchPhoto","//yun.dui88.com/kjy/media/file/20220629/55cda664352206a34f526082781538e1.jpeg");
params.put("politicCountenance",2);
params.put("roleType",1);
params.put("sellerLevel",1);
params.put("sellerType","autarky");
params.put("serialNumber","560743");
params.put("signedType","labour_service");
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_sellerUpdate);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_sellerUpdate,"编辑销售信息失败",response.body().asString()));
}
@Test(description = "换绑手机",priority = 8)
public void 换绑手机(){
Map<String,Object> params = new HashMap<>();
params.put("id",jjbSellerId);
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
String num = df.format(new Date());
String bindPhoneNumber = "178" + num;
params.put("newPhoneNum",bindPhoneNumber);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_phoneChange);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_phoneChange,"换绑手机失败",response.body().asString()));
}
@Test(description = "权限管理开关控制",priority = 9)
public void 权限管理开关控制(){
Map<String,Object> params = new HashMap<>();
params.put("assignNewCustPermission",0);
params.put("assignRecycleCustPermission",0);
params.put("callPermission",0);
params.put("id",jjbSellerId);
params.put("sellerStatus",1);
params.put("workStatus",1);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_updatePermission);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_updatePermission,"权限管理开关变更失败",response.body().asString()));
}
@Test(description = "查看坐席列表",priority = 10)
public void 查看坐席列表(){
Response response = network.getResponse(BasicConfig.JiuJiuBao_availableList);
Object data = response.jsonPath().getJsonObject("data");
Assert.assertNotNull(data,network.message(BasicConfig.JiuJiuBao_availableList,"坐席列表获取失败",response.body().asString()));
}
@Test(description = "绑定坐席",priority = 11)
public void 绑定坐席(){
Map<String,Object> params = new HashMap<>();
params.put("accountName","8005@fhpcs");
params.put("sellerId",jjbSellerId);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_accountBind);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_accountBind,"绑定坐席失败",response.body().asString()));
}
@Test(description = "解绑外呼坐席",priority = 12)
public void 解绑外呼坐席(){
Map<String,Object> params = new HashMap<>();
params.put("sellerId",jjbSellerId);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_accountUnbind);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_accountUnbind,"解绑外呼坐席失败",response.body().asString()));
}
@Test(description = "申请离职",priority = 13)
public void 申请离职(){
Map<String,Object> params = new HashMap<>();
params.put("id",jjbSellerId);
params.put("leaveReason","自动化测试申请离职");
long leaveTime = Calendar.getInstance().getTimeInMillis();
params.put("leaveTime",leaveTime);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_auditLeave);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_auditLeave,"申请离职失败",response.body().asString()));
}
@Test(description = "查看离职审批列表",priority = 14)
public void 查看离职审批列表(){
Map<String,Object> params = new HashMap<>();
params.put("auditType",2);
params.put("pageIndex",1);
params.put("pageSize",50);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_auditList);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertTrue(success,network.message(params,BasicConfig.JiuJiuBao_auditList,"查看离职审批列表失败",response.body().asString()));
//获取离职审批数目
leaveTotalCount = response.jsonPath().getInt("data.totalCount");
//获取离职审批的id
leaveIsApproveId = response.jsonPath().getInt("data.list[0].id");
}
@Test(description = "离职审批驳回",priority = 15)
public void 离职审批驳回(){
Map<String,Object> params =new HashMap<>();
params.put("auditFlag",0);
params.put("id",leaveIsApproveId);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_auditIsApprove);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_auditIsApprove,"离职审批驳回失败",response.body().asString()));
//检查销售在职状态
params.clear();
params.put("sellerId",jjbSellerId);
Response diMissionRes = network.getResponse(params,BasicConfig.JiuJiuBao_auditSubmitDetail);
int dimissionStatus = diMissionRes.jsonPath().getInt("data.dimissionStatus");
Assert.assertTrue(dimissionStatus==0,network.message(params,BasicConfig.JiuJiuBao_auditSubmitDetail,"销售在职状态记录错误",diMissionRes.body().asString()));
}
@Test(description = "离职审批通过",priority = 16)
public void 离职审批通过(){
Map<String,Object> params = new HashMap<>();
//提交离职审批
params.put("id",jjbSellerId);
params.put("leaveReason","自动化测试申请离职");
long leaveTime = Calendar.getInstance().getTimeInMillis();
params.put("leaveTime",leaveTime);
Response response = network.postResponse(params,BasicConfig.JiuJiuBao_auditLeave);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.JiuJiuBao_auditLeave,"申请离职失败",response.body().asString()));
//获取离职审批id
params.clear();
params.put("auditType",2);
params.put("pageIndex",1);
params.put("pageSize",50);
Response leaveRes = network.postResponse(params,BasicConfig.JiuJiuBao_auditList);
leaveIsApproveId = leaveRes.jsonPath().getInt("data.list[0].id");
Assert.assertNotNull(leaveIsApproveId,network.message(params,BasicConfig.JiuJiuBao_auditLeave,"申请离职失败",leaveRes.body().asString()));
//离职审批通过
params.clear();
params.put("auditFlag",1);
params.put("id",leaveIsApproveId);
Response leaveTrueRes = network.postResponse(params,BasicConfig.JiuJiuBao_auditIsApprove);
boolean leaveData = leaveTrueRes.jsonPath().getBoolean("data");
Assert.assertTrue(leaveData,network.message(params,BasicConfig.JiuJiuBao_auditIsApprove,"离职审批通过失败",leaveTrueRes.body().asString()));
}
@Test(description = "查看在职状态",priority = 17)
public void 查看在职状态(){
Map<String,Object> params =new HashMap<>();
params.put("sellerId",jjbSellerId);
Response diMissionRes = network.getResponse(params,BasicConfig.JiuJiuBao_auditSubmitDetail);
int dimissionStatus = diMissionRes.jsonPath().getInt("data.dimissionStatus");
Assert.assertTrue(dimissionStatus==1,network.message(params,BasicConfig.JiuJiuBao_auditSubmitDetail,"销售在职状态记录错误",diMissionRes.body().asString()));
}
@Test(description = "退出登录",priority = 18)
public void 退出登录(){
Response response = network.postResponse(BasicConfig.JiuJiuBao_aloginOut);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(BasicConfig.JiuJiuBao_aloginOut,"退出登录失败",response.body().asString()));
}
}
package com.oto.cases.otoseller;
import com.oto.config.BasicConfig;
import com.oto.utils.NetworkUtils;
import io.restassured.response.Response;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.HashMap;
import static com.oto.config.BasicConfig.LEADER_ID;
import static com.oto.utils.BaseUtils.ssoLogin;
import static com.oto.utils.ThreadSleepUtils.sleep;
public class Manager {
private static final NetworkUtils network = NetworkUtils.getInstance();
private int sellerId; //销售ID
@BeforeTest
public void setUp(){
ssoLogin();
}
@Test(description = "分页查看销售列表",priority = 1)
public void 分页查看销售列表(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", "1");
params.put("pageSize", "20");
Response response = network.getResponse(params, BasicConfig.MANAGER_oto_sellerList);
int size = response.jsonPath().getInt("data.list.size()");
Assert.assertTrue(size>0,network.message(params,BasicConfig.MANAGER_oto_sellerList,"销售列表为空",response.body().asString()));
int workStatus = response.jsonPath().getInt("data.list.find{it.id == "+ 42+"}.workStatus");
int assignNewCustPermission = response.jsonPath().getInt("data.list.find{it.id == "+ 42+"}.assignNewCustPermission");
int assignRecycleCustPermission = response.jsonPath().getInt("data.list.find{it.id == "+ 42+"}.assignRecycleCustPermission");
int callPermission = response.jsonPath().getInt("data.list.find{it.id == "+ 42+"}.callPermission");
Assert.assertEquals(workStatus,1,network.message(params,BasicConfig.MANAGER_oto_searchSeller,"工作状态错误",response.body().asString()));
Assert.assertEquals(assignNewCustPermission,1,network.message(params,BasicConfig.MANAGER_oto_searchSeller,"认领新客户及强制分配权限错误",response.body().asString()));
Assert.assertEquals(assignRecycleCustPermission,1,network.message(params,BasicConfig.MANAGER_oto_searchSeller,"认领回收客户权限错误",response.body().asString()));
Assert.assertEquals(callPermission,1,network.message(params,BasicConfig.MANAGER_oto_searchSeller,"呼叫权限错误",response.body().asString()));
}
@Test(description = "通过销售名称查找销售",priority = 2)
public void 通过销售名称查找销售(){
HashMap<String,Object> params = new HashMap<>();
params.put("sellerName", "勿动-自动化测试销售");
Response response = network.getResponse(params, BasicConfig.MANAGER_oto_searchSeller);
int size = response.jsonPath().getInt("data.size()");
Assert.assertTrue(size>0,network.message(params,BasicConfig.MANAGER_oto_searchSeller,"查找结果为空",response.body().asString()));
sellerId = response.jsonPath().getInt("data[0].id");
}
@Test(description = "修改销售信息",priority = 3)
public void 修改销售信息(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", sellerId);
params.put("sellerName", "勿动-自动化更新销售");
params.put("phoneNumber", "18248405155");
params.put("roleType", 1);
params.put("callPermission", 0);
params.put("sellerStatus", 0);
params.put("companyId", 1);
params.put("companyName", "勿动-自动化测试公司");
params.put("sellerLevel", 2);
params.put("workStatus", 1);
params.put("parentId", 28);
Response response = network.postResponse(params, BasicConfig.MANAGER_oto_updateSeller);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_updateSeller,"修改客户失败",response.body().asString()));
sleep(1000);
HashMap<String,Object> selectParam = new HashMap<>();
selectParam.put("sellerName", "勿动-自动化更新销售");
selectParam.put("phoneNumber", "18248405155");
selectParam.put("pageIndex", "1");
selectParam.put("pageSize", "10");
response = network.getResponse(selectParam, BasicConfig.MANAGER_oto_sellerList);
int size = response.jsonPath().getInt("data.list.size()");
Assert.assertTrue(size>0,network.message(selectParam,BasicConfig.MANAGER_oto_sellerList,"查找结果为空",response.body().asString()));
//还原
params.put("callPermission", 1);
params.put("sellerStatus", 1);
params.put("companyId", 5);
params.put("sellerLevel", 1);
params.put("parentId", LEADER_ID);
params.put("sellerName", "勿动-自动化测试销售");
response = network.postResponse(params, BasicConfig.MANAGER_oto_updateSeller);
data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_updateSeller,"修改客户失败",response.body().asString()));
}
@Test(description = "查询渠道列表",priority = 4)
public void 查询渠道列表(){
Response response = network.getResponse(BasicConfig.MANAGER_oto_channelList);
int size = response.jsonPath().getInt("data.size");
Assert.assertTrue(size>0,network.message(BasicConfig.MANAGER_oto_channelList,"渠道列表为空",response.body().asString()));
}
@Test(description = "不可新增同一手机号销售",priority = 5)
public void 不可新增同一手机号销售(){
HashMap<String,Object> params = new HashMap<>();
params.put("sellerName", "勿动-自动化销售");
params.put("phoneNumber", "18248405155");
params.put("roleType", 1);
params.put("callPermission", 1);
params.put("sellerStatus", 1);
params.put("companyId", 1);
params.put("sellerLevel", 1);
params.put("workStatus", 1);
params.put("assignNewCustPermission", 1);
params.put("assignRecycleCustPermission", 1);
Response response = network.postResponse(params, BasicConfig.MANAGER_oto_saveSeller);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(params,BasicConfig.MANAGER_oto_saveSeller,"新增同一手机号销售成功",response.body().asString()));
}
//接口对此场景做校验,仅前端做了限制
// @Test(description = "不可修改总监为普通",priority = 6)
// public void 不可修改总监为普通(){
// HashMap<String,Object> params = new HashMap<>();
// params.put("id", LEADER_ID);
// params.put("sellerName", "勿动-自动化测试总监");
// params.put("phoneNumber", "18248405155");
// params.put("roleType", 1);
// params.put("callPermission", 1);
// params.put("sellerStatus", 1);
// params.put("companyId", 3);
// params.put("sellerLevel", 1);
// Response response = network.postResponse(params, BasicConfig.MANAGER_oto_updateSeller);
// boolean success = response.jsonPath().getBoolean("success");
// Assert.assertFalse(success,network.message(params,BasicConfig.MANAGER_oto_updateSeller,"修改总监为普通销售成功",response.body().asString()));
// }
@Test(description = "不可新增同名公司",priority = 7)
public void 不可新增同名公司(){
HashMap<String,Object> params = new HashMap<>();
params.put("companyName", "勿动-自动化测试公司");
Response response = network.postResponse(params, BasicConfig.MANAGER_oto_saveCompany);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(params,BasicConfig.MANAGER_oto_saveCompany,"新增同名公司成功",response.body().asString()));
}
@Test(description = "修改公司名称",priority = 8)
public void 修改公司名称(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", 5);
params.put("companyName", "勿动-自动化测试公司更新");
Response response = network.postResponse(params, BasicConfig.MANAGER_oto_updateCompany);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_updateCompany,"修改客户失败",response.body().asString()));
}
@Test(description = "分页查看公司列表",priority = 9)
public void 分页查看公司列表(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 20);
Response response = network.getResponse(params, BasicConfig.MANAGER_oto_listCompany);
int size = response.jsonPath().getInt("data.list.findAll{it.companyName == \""+"勿动-自动化测试公司更新"+"\"}.size()");
Assert.assertEquals(size,1,network.message(params,BasicConfig.MANAGER_oto_listCompany,"查询更新的公司名称失败",response.body().asString()));
//还原
params.clear();
params.put("id", 5);
params.put("companyName", "勿动-自动化测试公司");
response = network.postResponse(params, BasicConfig.MANAGER_oto_updateCompany);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_updateCompany,"修改客户失败",response.body().asString()));
}
@Test(description = "查看所有公司列表",priority = 10)
public void 查看所有公司列表(){
Response response = network.getResponse(BasicConfig.MANAGER_oto_listAllCompany);
int size = response.jsonPath().getInt("data.list.size()");
Assert.assertTrue(size>0,network.message(BasicConfig.MANAGER_oto_listAllCompany,"查看所有公司列表为空",response.body().asString()));
}
@Test(description = "查看所有总监列表",priority = 11)
public void 查看所有总监列表(){
Response response = network.getResponse(BasicConfig.MANAGER_oto_directorList);
int size = response.jsonPath().getInt("data.list.size()");
Assert.assertTrue(size>0,network.message(BasicConfig.MANAGER_oto_directorList,"查看所有总监列表为空",response.body().asString()));
}
@Test(description = "修改工作状态为请假中",priority = 12)
public void 修改工作状态为请假中(){
HashMap<String,Object> params = new HashMap<>();
params.put("sellerId", LEADER_ID);
params.put("workStatus", 0);
Response response = network.postResponse(params, BasicConfig.MANAGER_oto_switchWorkStatus);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_updateCompany,"修改工作状态为请假中失败",response.body().asString()));
}
@Test(description = "总监下有销售离职失败",priority = 13)
public void 总监下有销售离职失败(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", 43);
params.put("dimissionStatus", 1);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_switchDimissionStatus);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(params,BasicConfig.MANAGER_oto_switchDimissionStatus,"总监名下存在销售但离职成功",response.body().asString()));
}
@Test(description = "修改公司产品",priority = 14)
public void 修改公司产品(){
ArrayList companyIds = new ArrayList();
companyIds.add(5);
ArrayList costOptions = new ArrayList();
costOptions.add(0);
costOptions.add(1);
costOptions.add(2);
ArrayList moneyOptions = new ArrayList();
moneyOptions.add(1);
moneyOptions.add(2);
HashMap<String,Object> params = new HashMap<>();
params.put("id", 19);
params.put("prodName", "勿动-自动化专用产品更新");
params.put("companyIds", companyIds);
params.put("costOptions", costOptions);
params.put("moneyOptions", moneyOptions);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_productSave);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_productSave,"修改公司产品失败",response.body().asString()));
}
@Test(description = "查看产品列表",priority = 15)
public void 查看产品列表(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 10);
params.put("companyIds", 5);
params.put("prodStatus", 1);
Response response = network.getResponse(params,BasicConfig.MANAGER_oto_productList);
int size = response.jsonPath().getInt("data.list.size()");
Assert.assertTrue(size>0,network.message(params,BasicConfig.MANAGER_oto_productList,"查询公司产品为空",response.body().asString()));
int id = response.jsonPath().getInt("data.list[0].id");
Assert.assertEquals(id,19,network.message(params,BasicConfig.MANAGER_oto_productList,"查询公司产品错误",response.body().asString()));
int costOptionsSize = response.jsonPath().getInt("data.list[0].costOptions.size()");
String prodName = response.jsonPath().getString("data.list[0].prodName");
Assert.assertEquals(costOptionsSize,3,network.message(params,BasicConfig.MANAGER_oto_productList,"产品的缴费期未更新",response.body().asString()));
Assert.assertEquals(prodName,"勿动-自动化专用产品更新",network.message(params,BasicConfig.MANAGER_oto_productList,"产品的名称未更新",response.body().asString()));
}
@Test(description = "还原公司产品",priority = 16)
public void 还原公司产品(){
ArrayList companyIds = new ArrayList();
companyIds.add(5);
ArrayList costOptions = new ArrayList();
costOptions.add(0);
costOptions.add(1);
costOptions.add(2);
costOptions.add(3);
ArrayList moneyOptions = new ArrayList();
moneyOptions.add(1);
moneyOptions.add(2);
moneyOptions.add(3);
HashMap<String,Object> params = new HashMap<>();
params.put("id", 19);
params.put("prodName", "勿动-自动化专用产品");
params.put("companyIds", companyIds);
params.put("costOptions", costOptions);
params.put("moneyOptions", moneyOptions);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_productSave);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_productSave,"修改公司产品失败",response.body().asString()));
}
@Test(description = "查看第三方账号列表",priority = 17)
public void 查看第三方账号列表(){
Response response = network.getResponse(BasicConfig.MANAGER_oto_accountList);
int size = response.jsonPath().getInt("data.size()");
Assert.assertTrue(size>0,network.message(BasicConfig.MANAGER_oto_accountList,"查询第三方账号列表为空",response.body().asString()));
}
@Test(description = "绑定第三方坐席",priority = 18)
public void 绑定第三方坐席(){
HashMap<String,Object> params = new HashMap<>();
params.put("sellerId", sellerId);
params.put("accountName", "8060@fhpcs");
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_accountBind);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_accountBind,"绑定第三方账号失败",response.body().asString()));
}
@Test(description = "解绑第三方坐席",priority = 19)
public void 解绑第三方坐席(){
HashMap<String,Object> params = new HashMap<>();
params.put("sellerId", sellerId);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_accountUnbind);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_accountUnbind,"解绑坐席账号失败",response.body().asString()));
}
@Test(description = "换绑手机并还原",priority = 20)
public void 换绑手机并还原(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", sellerId);
params.put("newPhoneNum", "14783743847");
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_change);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_change,"解绑坐席账号失败",response.body().asString()));
params.clear();
params.put("phoneNumber", "14783743847");
params.put("pageIndex", "1");
params.put("pageSize", "20");
response = network.getResponse(params, BasicConfig.MANAGER_oto_sellerList);
int id = response.jsonPath().getInt("data.list[0].id");
Assert.assertEquals(id,sellerId,network.message(params,BasicConfig.MANAGER_oto_sellerList,"销售列表为空",response.body().asString()));
params.clear();
params.put("id", sellerId);
params.put("newPhoneNum", "18248405155");
response = network.postResponse(params,BasicConfig.MANAGER_oto_change);
data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_change,"解绑坐席账号失败",response.body().asString()));
}
//
}
package com.oto.cases.otoseller;
import com.oto.cases.admin.Authorization;
import com.oto.config.BasicConfig;
import com.oto.sql.KjyLiveNormalDB;
import com.oto.sql.UserSqlFactory;
import com.oto.utils.IdMakeUtil;
import com.oto.utils.NetworkUtils;
import io.restassured.response.Response;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import static com.oto.cases.otoseller.Work.phone;
import static com.oto.utils.BaseUtils.*;
import static com.oto.utils.ThreadSleepUtils.sleep;
//手机端
public class Phone implements Authorization {
private static final NetworkUtils network = NetworkUtils.getInstance();
private String cust_id;//加密的客户ID
private String custName;
private String introduceCustomer_id;
private String myselfCustomer_id;
private long productId = 19;
private int businessId;
private ArrayList ids;
private ArrayList<String> interviewIds;
private Object scanCodeId;
@BeforeTest
public void setUp(){
//登录销售工作台手机端
otoSellerTku();
ids = new ArrayList<>();
interviewIds = new ArrayList<>();
}
@Test(description = "查看我的客户",priority = 1)
public void 查看我的客户(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageSize", "20");
Response response = network.getResponse(params, BasicConfig.PHONE_customerList);
int size = response.jsonPath().getInt("data.myCustomerVos.size()");
Assert.assertTrue(size>0,network.message(params,BasicConfig.PHONE_customerList,"客户列表为空",response.body().asString()));
}
@Test(description = "不可创建重复手机号的客户",priority = 2)
public void 不可创建重复手机号的客户(){
HashMap<String,Object> params = new HashMap<>();
params.put("custName", "重复客户");
params.put("custPhoneNum", phone);
params.put("custSource", 1);
Response response = network.postResponse(params, BasicConfig.PHONE_customerSave);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(params,BasicConfig.PHONE_customerSave,"手机号重复创建客户成功",response.body().asString()));
}
@Test(description = "创建缘故客户",priority = 3)
public void 创建缘故客户(){
HashMap<String,Object> params = new HashMap<>();
params.put("custName", "自动化缘故客户");
params.put("custPhoneNum", "13410000001");
params.put("custSource", 1);
Response response = network.postResponse(params, BasicConfig.PHONE_customerSave);
myselfCustomer_id = response.jsonPath().getString("data");
Assert.assertNotNull(myselfCustomer_id,network.message(params,BasicConfig.PHONE_customerSave,"创建缘故客户失败",response.body().asString()));
}
@Test(description = "创建转介绍客户",priority = 4)
public void 创建转介绍客户(){
HashMap<String,Object> params = new HashMap<>();
params.put("custName", "自动化转介绍客户");
params.put("custPhoneNum", "13410000002");
params.put("introducerId", myselfCustomer_id);
params.put("custSource", 2);
Response response = network.postResponse(params, BasicConfig.PHONE_customerSave);
introduceCustomer_id = response.jsonPath().getString("data");
Assert.assertNotNull(introduceCustomer_id,network.message(params,BasicConfig.PHONE_customerSave,"创建转介绍客户失败",response.body().asString()));
}
@Test(description = "姓名搜索客户",priority = 5)
public void 姓名搜索客户(){
HashMap<String,Object> params = new HashMap<>();
params.put("custName", "自动化测试用户");
params.put("pageSize", "20");
Response response = network.getResponse(params, BasicConfig.PHONE_customerList);
int size = response.jsonPath().getInt("data.myCustomerVos.size()");
Assert.assertEquals(size,1,network.message(params,BasicConfig.PHONE_customerList,"查找不到该客户",response.body().asString()));
cust_id = response.jsonPath().getString("data.myCustomerVos[0].id");
custName = response.jsonPath().getString("data.myCustomerVos[0].custName");
}
@Test(description = "姓名模糊关联客户",priority = 6)
public void 姓名模糊查找客户(){
HashMap<String,Object> params = new HashMap<>();
params.put("custName", "自动化");
Response response = network.getResponse(params, BasicConfig.PHONE_fuzzyList);
int size = response.jsonPath().getInt("data.myCustomerVos.size()");
Assert.assertTrue(size>0,network.message(params,BasicConfig.PHONE_fuzzyList,"创建缘故客户失败",response.body().asString()));
}
@Test(description = "创建社区面访并关联转介绍和缘故客户",priority = 7)
public void 创建社区面访并关联转介绍和缘故客户(){
HashMap<String,Object> params = new HashMap<>();
ids = new ArrayList();
ids.add(cust_id);
ids.add(myselfCustomer_id);
ids.add(introduceCustomer_id);
params.put("custIds", ids);
params.put("interviewType", 2);
params.put("appointmentTime", System.currentTimeMillis()+3600000);
Response response = network.postResponse(params, BasicConfig.PHONE_interviewSave);
int size = response.jsonPath().getJsonObject("data.size()");
Assert.assertEquals(size,3,network.message(params,BasicConfig.PHONE_interviewSave,"创建普通面访失败",response.body().asString()));
interviewIds.add(response.jsonPath().getString("data[0]"));
interviewIds.add(response.jsonPath().getString("data[1]"));
interviewIds.add(response.jsonPath().getString("data[2]"));
}
@Test(description = "查询面访二维码",priority = 8)
public void 查询面访二维码(){
HashMap<String,Object> params = new HashMap<>();
params.put("ids", interviewIds.get(0)+","+interviewIds.get(1)+","+interviewIds.get(2));
Response response = network.getResponse(params, BasicConfig.PHONE_interviewCode);
int size = response.jsonPath().getInt("data.size()");
int statusCount = response.jsonPath().getInt("data.findAll{it.interviewStatus == 1}.size()");
Assert.assertEquals(size,3,network.message(params,BasicConfig.PHONE_interviewCode,"面访码数量错误",response.body().asString()));
Assert.assertEquals(statusCount,3,network.message(params,BasicConfig.PHONE_interviewCode,"面访码数量错误",response.body().asString()));
}
@Test(description = "上传地理位置",priority = 9)
public void 上传地理位置(){
HashMap<String,Object> params = new HashMap<>();
params.put("latitude", 30.287816);
params.put("longitude", 120.111991);
params.put("id", interviewIds.get(0));
Response response = network.postResponse(params, BasicConfig.PHONE_address);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.PHONE_customerSave,"上传地理位置失败",response.body().asString()));
}
@Test(description = "销售查询面访状态",priority = 10)
public void 销售查询面访状态() {
sleep(1000);
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
Response response = network.getResponse(params, BasicConfig.PHONE_interviewStatus);
int interviewStatus = response.jsonPath().getInt("data.interviewStatus");
Assert.assertEquals(interviewStatus,1,network.message(params,BasicConfig.PHONE_interviewStatus,"面访状态错误:非未授权",response.body().asString()));
}
@Test(description = "已存在未结束的普通面访后创建普通面访失败",priority = 11)
public void 已存在未结束的社区面访后创建社区面访失败(){
HashMap<String,Object> params = new HashMap<>();
params.put("custIds", ids);
params.put("interviewType", 2);
params.put("appointmentTime", System.currentTimeMillis()+3600000);
Response response = network.postResponse(params, BasicConfig.PHONE_interviewSave);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(params,BasicConfig.PHONE_interviewSave,"存在未结束普通面访时创建普通面访成功",response.body().asString()));
}
@Test(description = "发起面访时查询面访详情",priority = 12)
public void 发起面访时查询面访详情(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", cust_id);
params.put("interviewType", 2);
Response response = network.getResponse(params, BasicConfig.PHONE_appointmentDetail);
String customerName = response.jsonPath().getString("data.custName");
String id = response.jsonPath().getString("data.id");
Assert.assertEquals(customerName,custName,network.message(params,BasicConfig.PHONE_appointmentDetail,"查询面访详情的客户姓名错误",response.body().asString()));
Assert.assertEquals(id, interviewIds.get(0),network.message(params,BasicConfig.PHONE_appointmentDetail,"查询面访详情的id错误",response.body().asString()));
}
@Test(description = "修改面访时查询面访详情",priority = 13)
public void 修改面访时查询面访详情(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
Response response = network.getResponse(params, BasicConfig.PHONE_interviewDetail);
String customerName = response.jsonPath().getString("data.custName");
Assert.assertEquals(customerName,custName,network.message(params,BasicConfig.PHONE_interviewDetail,"查询面访详情的客户姓名错误",response.body().asString()));
}
@Test(description = "修改面访时间",priority = 14)
public void 修改面访时间(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
params.put("appointmentTime", System.currentTimeMillis()+7200000);
Response response = network.postResponse(params, BasicConfig.PHONE_interviewUpdate);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.PHONE_interviewUpdate,"修改社区时间失败",response.body().asString()));
}
@Test(description = "授权失败",priority = 15)
public void 授权失败() throws SQLException {
agentTku();
Map<String, Object> result = KjyLiveNormalDB.getInstance().findSimpleResult(UserSqlFactory.selectCodeIdByCustomerId, IdMakeUtil.decodingId(cust_id));
scanCodeId = result.get("scan_code_id");
HashMap<String,Object> params = new HashMap<>();
params.put("scanCodeId", IdMakeUtil.encodingId((Long) scanCodeId));
params.put("scanCodeType", 1048);
Response response = network.postResponse(params, BasicConfig.PHONE_fail);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.PHONE_fail,"授权失败接口错误",response.body().asString()));
}
@Test(description = "销售查询面访状态更新为授权失败",priority = 16)
public void 销售查询面访状态更新为授权失败() {
sleep(1000);
otoSellerTku();
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
Response response = network.getResponse(params, BasicConfig.PHONE_interviewStatus);
int interviewStatus = response.jsonPath().getInt("data.interviewStatus");
Assert.assertEquals(interviewStatus,5,network.message(params,BasicConfig.PHONE_interviewStatus,"面访状态错误:非未授权",response.body().asString()));
}
@Test(description = "非面对面扫码并评价",priority = 17)
public void 扫码绑定微信用户(){
agentTku();
scanCode(IdMakeUtil.encodingId((Long) scanCodeId),1048);
}
@Test(description = "销售查询面访状态更新为待上传",priority = 18)
public void 销售查询面访状态更新为待上传() {
sleep(2000);
otoSellerTku();
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
Response response = network.getResponse(params, BasicConfig.PHONE_interviewStatus);
int interviewStatus = response.jsonPath().getInt("data.interviewStatus");
Assert.assertEquals(interviewStatus,3,network.message(params,BasicConfig.PHONE_interviewStatus,"扫码评价失败",response.body().asString()));
}
@Test(description = "查询面访异常类型",priority = 19)
public void 查询面访异常类型(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
Response response = network.getResponse(params, BasicConfig.PHONE_getUnusualTypes);
int size = response.jsonPath().getInt("data.size()");
Assert.assertEquals(size,2,network.message(params,BasicConfig.PHONE_getUnusualTypes,"面访异常错误",response.body().asString()));
}
@Test(description = "查询面访回填信息",priority = 20)
public void 查询面访回填信息(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
Response response = network.getResponse(params, BasicConfig.PHONE_custExtDetail);
String interviewAddress = response.jsonPath().getString("data.interviewAddress");
int commitPlanFlag = response.jsonPath().getInt("data.commitPlanFlag");
Assert.assertNotNull(interviewAddress,network.message(params,BasicConfig.PHONE_custExtDetail,"面访列表为空",response.body().asString()));
Assert.assertEquals(commitPlanFlag,0,network.message(params,BasicConfig.PHONE_custExtDetail,"面访列表为空",response.body().asString()));
}
@Test(description = "上传社区面访详情",priority = 21)
public void 上传社区面访详情(){
HashMap<String,Object> params = new HashMap<>();
ArrayList unusualTypes = new ArrayList();
unusualTypes.add(1);
unusualTypes.add(2);
ArrayList unusualProofs = new ArrayList();
unusualProofs.add("https://yun.dui88.com/kjy/image/20220506/ecf1d585e2e040ad97ec7996ce5bf2a3.jpg");
unusualProofs.add("https://yun.dui88.com/kjy/image/20220505/62cc0df86ed7430ea67d5015ee3fcc2b.jpg");
params.put("id", interviewIds.get(0));
params.put("interviewRemark", "第一次社区参观");
params.put("coreMaker", 2);
params.put("followWeight", 1);
params.put("commitPlanFlag", 0);
params.put("commitInsure", 0);
params.put("commitCustStatus", 2);
params.put("isNormal", false);
params.put("insureReason", "未确认投保要素说明");
params.put("unusualTypes", unusualTypes);
params.put("unusualExplain", "手机号不一致且非面对面扫码的情况说明");
params.put("unusualProofs", unusualProofs);
Response response = network.postResponse(params, BasicConfig.PHONE_interviewFeedback);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertTrue(success,network.message(params,BasicConfig.PHONE_interviewFeedback,"上传面访失败",response.body().asString()));
}
@Test(description = "查看面访详情",priority = 22)
public void 查看面访详情(){
sleep(1000);
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
Response response = network.getResponse(params, BasicConfig.PHONE_feedbackDetail);
int followWeight = response.jsonPath().getInt("data.followWeight");
int commitPlanFlag = response.jsonPath().getInt("data.commitPlanFlag");
int size = response.jsonPath().getInt("data.unusualTypes.size()");
String unusualExplain = response.jsonPath().getString("data.unusualExplain");
Assert.assertEquals(followWeight,1,network.message(params,BasicConfig.PHONE_feedbackDetail,"关注度显示错误",response.body().asString()));
Assert.assertEquals(commitPlanFlag,0,network.message(params,BasicConfig.PHONE_feedbackDetail,"是否提交计划书显示错误",response.body().asString()));
Assert.assertEquals(size,2,network.message(params,BasicConfig.PHONE_feedbackDetail,"面访异常类型显示错误",response.body().asString()));
Assert.assertEquals(unusualExplain,"手机号不一致且非面对面扫码的情况说明",network.message(params,BasicConfig.PHONE_feedbackDetail,"异常情况说明显示错误",response.body().asString()));
}
@Test(description = "查看我的面访状态更新为审批中",priority = 23)
public void 查看我的面访状态更新为审批中(){
HashMap<String,Object> params = new HashMap<>();
params.put("custName", "自动化测试用户");
params.put("pageSize", "20");
Response response = network.getResponse(params, BasicConfig.PHONE_interviewList);
int size = response.jsonPath().getInt("data.customerInterviewVos.size()");
int interviewStatus = response.jsonPath().getInt("data.customerInterviewVos.find{it.id == '"+ interviewIds.get(0) +"'}.interviewStatus");
Assert.assertEquals(size,1,network.message(params,BasicConfig.PHONE_interviewList,"面访列表为空",response.body().asString()));
Assert.assertEquals(interviewStatus,6,network.message(params,BasicConfig.PHONE_interviewList,"面访状态错误",response.body().asString()));
}
@Test(description = "总监查看审批列表",priority = 24)
public void 总监查看审批列表(){
otoLeaderAuth();
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex",1);
params.put("pageSize",20);
params.put("auditState",1);
Response response =network.getResponse(params,BasicConfig.WORK_interviewAuditList);
int size = response.jsonPath().getInt("data.list.size()");
int unusualTypes = response.jsonPath().getInt("data.list[0].unusualTypes.size()");
String sellerName = response.jsonPath().getString("data.list[0].sellerName");
Assert.assertTrue(size>0,network.message(BasicConfig.WORK_interviewAuditList,"待审批列表为空",response.body().asString()));
Assert.assertEquals(unusualTypes,2,network.message(BasicConfig.WORK_interviewAuditList,"面访异常错误",response.body().asString()));
Assert.assertEquals(sellerName,"勿动-自动化测试销售",network.message(BasicConfig.WORK_interviewAuditList,"销售名称错误",response.body().asString()));
businessId = response.jsonPath().getInt("data.list[0].businessId");
}
@Test(description = "总监驳回审批",priority = 25)
public void 总监驳回审批(){
otoLeaderAuth();
HashMap<String,Object> params = new HashMap<>();
params.put("businessId",businessId);
Response response =network.postResponse(params,BasicConfig.WORK_interviewAuditReject);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_interviewAuditReject,"驳回审批失败",response.body().asString()));
}
@Test(description = "查询客户信息未更新",priority = 26)
public void 查询客户信息未更新(){
otosellerAuth();
HashMap<String,Object> params = new HashMap<>();
params.put("custId", IdMakeUtil.decodingId(cust_id));
Response response = network.getResponse(params,BasicConfig.WORK_detail);
int custFlow = response.jsonPath().getInt("data.custInfo.custFlow");
int commitPlanFlag = response.jsonPath().getInt("data.custInfo.commitPlanFlag");
Assert.assertEquals(custFlow,1,network.message(params,BasicConfig.WORK_detail,"新客户流程组状态错误非1",response.body().asString()));
Assert.assertEquals(commitPlanFlag,0,network.message(params,BasicConfig.WORK_detail,"新客户投保要素确认状态错误非0",response.body().asString()));
}
@Test(description = "查看我的面访状态更新为已失效",priority = 27)
public void 查看我的面访状态更新为已失效(){
HashMap<String,Object> params = new HashMap<>();
params.put("custName", "自动化测试用户");
params.put("pageSize", "20");
Response response = network.getResponse(params, BasicConfig.PHONE_interviewList);
int interviewStatus = response.jsonPath().getInt("data.customerInterviewVos.find{it.id == '"+ interviewIds.get(0) +"'}.interviewStatus");
Assert.assertEquals(interviewStatus,7,network.message(params,BasicConfig.PHONE_interviewList,"面访状态错误",response.body().asString()));
}
@Test(description = "取消面访",priority = 28)
public void 取消面访(){
interviewCancle(interviewIds.get(1));
interviewCancle(interviewIds.get(2));
}
@Test(description = "客户再次创建面访并扫码评价",priority = 29)
public void 客户再次创建面访并扫码评价() throws SQLException {
otoSellerTku();
HashMap<String,Object> params = new HashMap<>();
ids = new ArrayList();
ids.add(cust_id);
params.put("custIds", ids);
params.put("interviewType", 2);
params.put("appointmentTime", System.currentTimeMillis()+3600000);
Response response = network.postResponse(params, BasicConfig.PHONE_interviewSave);
interviewIds.clear();
interviewIds.add(response.jsonPath().getString("data[0]"));
agentTku();
Map<String, Object> result = KjyLiveNormalDB.getInstance().findSimpleResult(UserSqlFactory.selectCodeIdByCustomerId, IdMakeUtil.decodingId(cust_id));
scanCodeId = result.get("scan_code_id");
System.out.println(scanCodeId);
scanCode(IdMakeUtil.encodingId((Long) scanCodeId),1047);
}
@Test(description = "销售上传社区面访",priority = 30)
public void 销售上传社区面访(){
otoSellerTku();
HashMap<String,Object> params = new HashMap<>();
ArrayList unusualTypes = new ArrayList();
unusualTypes.add(2);
ArrayList unusualProofs = new ArrayList();
unusualProofs.add("https://yun.dui88.com/kjy/image/20220506/ecf1d585e2e040ad97ec7996ce5bf2a3.jpg");
params.put("id", interviewIds.get(0));
params.put("interviewRemark", "第一次社区参观");
params.put("coreMaker", 2);
params.put("followWeight", 1);
params.put("commitPlanFlag", 0);
params.put("isNormal", false);
params.put("unusualTypes", unusualTypes);
params.put("unusualExplain", "手机号不一致的情况说明");
params.put("unusualProofs", unusualProofs);
Response response = network.postResponse(params, BasicConfig.PHONE_interviewFeedback);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertTrue(success,network.message(params,BasicConfig.PHONE_interviewFeedback,"上传面访失败",response.body().asString()));
}
@Test(description = "总监通过审批",priority = 31)
public void 总监通过审批(){
otoLeaderAuth();
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex",1);
params.put("pageSize",20);
params.put("auditState",1);
Response response =network.getResponse(params,BasicConfig.WORK_interviewAuditList);
int size = response.jsonPath().getInt("data.list.size()");
Assert.assertTrue(size>0,network.message(BasicConfig.WORK_interviewAuditList,"待审批列表为空",response.body().asString()));
businessId = response.jsonPath().getInt("data.list[0].businessId");
params.clear();
params.put("businessId",businessId);
response =network.postResponse(params,BasicConfig.WORK_interviewAuditPass);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_interviewAuditPass,"通过审批失败",response.body().asString()));
}
@Test(description = "查询客户信息已更新",priority = 32)
public void 查询客户信息已更新(){
otosellerAuth();
HashMap<String,Object> params = new HashMap<>();
params.put("custId", IdMakeUtil.decodingId(cust_id));
Response response = network.getResponse(params,BasicConfig.WORK_detail);
int custFlow = response.jsonPath().getInt("data.custInfo.custFlow");
int commitPlanFlag = response.jsonPath().getInt("data.custInfo.commitPlanFlag");
Assert.assertEquals(custFlow,2,network.message(params,BasicConfig.WORK_detail,"新客户流程组状态错误非1",response.body().asString()));
Assert.assertEquals(commitPlanFlag,0,network.message(params,BasicConfig.WORK_detail,"新客户投保要素确认状态错误非0",response.body().asString()));
}
@Test(description = "查看我的面访状态更新为已完成",priority =33)
public void 查看我的面访状态更新为已完成(){
HashMap<String,Object> params = new HashMap<>();
params.put("custName", "自动化测试用户");
params.put("pageSize", "20");
Response response = network.getResponse(params, BasicConfig.PHONE_interviewList);
int interviewStatus = response.jsonPath().getInt("data.customerInterviewVos.find{it.id == '"+ interviewIds.get(0) +"'}.interviewStatus");
Assert.assertEquals(interviewStatus,4,network.message(params,BasicConfig.PHONE_interviewList,"面访状态错误",response.body().asString()));
}
@Test(description = "客户流程组_表格总览",priority = 34)
public void 客户流程组_表格总览(){
otosellerAuth();
Response response = network.getResponse(BasicConfig.WORK_staticChart);
int ondStep = response.jsonPath().getInt("data[0].custNum");
int twoStep = response.jsonPath().getInt("data[1].custNum");
Assert.assertEquals(ondStep,Work.chart.get("ondStep")+1,network.message(BasicConfig.WORK_staticChart,"创建的转介绍和缘故客户的流程组非1",response.body().asString()));
Assert.assertEquals(twoStep,Work.chart.get("twoStep")+1,network.message(BasicConfig.WORK_staticChart,"客户社区参观后未提交计划书流程组状态未变为2",response.body().asString()));
}
@Test(description = "创建普通面访",priority = 35)
public void 创建普通面访(){
otoSellerTku();
HashMap<String,Object> params = new HashMap<>();
ids = new ArrayList();
ids.add(cust_id);
params.put("custIds", ids);
params.put("interviewType", 1);
Response response = network.postResponse(params, BasicConfig.PHONE_interviewSave);
int size = response.jsonPath().getJsonObject("data.size()");
Assert.assertEquals(size,1,network.message(params,BasicConfig.PHONE_interviewSave,"创建普通面访失败",response.body().asString()));
interviewIds.clear();
interviewIds.add(response.jsonPath().getString("data[0]"));
}
@Test(description = "客户完成普通面访并扫码",priority = 36)
public void 客户完成普通面访并扫码() throws SQLException {
agentTku();
Map<String, Object> result = KjyLiveNormalDB.getInstance().findSimpleResult(UserSqlFactory.selectCodeIdByCustomerId, IdMakeUtil.decodingId(cust_id));
scanCodeId = result.get("scan_code_id");
System.out.println(scanCodeId);
scanCode(IdMakeUtil.encodingId((Long) scanCodeId),1047);
}
@Test(description = "二次正常扫码面访异常类型为空",priority = 37)
public void 二次正常扫码面访异常类型为空(){
otoSellerTku();
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
Response response = network.getResponse(params, BasicConfig.PHONE_getUnusualTypes);
int size = response.jsonPath().getInt("data.size()");
Assert.assertEquals(size,0,network.message(params,BasicConfig.PHONE_getUnusualTypes,"面访异常错误",response.body().asString()));
}
@Test(description = "查看公司产品列表",priority = 38)
public void 查看公司产品列表() {
String encodeProductId = IdMakeUtil.encodingId(productId);
Response response = network.getResponse(BasicConfig.PHONE_listBysellComp);
int size = response.jsonPath().getInt("data.findAll{it.id == '"+encodeProductId+"'}.size()");
Assert.assertEquals(size,1,network.message(BasicConfig.PHONE_listBysellComp,"产品列表未包含已上架产品",response.body().asString()));
}
@Test(description = "下架公司产品",priority = 39)
public void 下架公司产品() {
ssoLogin();
HashMap<String,Object> params = new HashMap<>();
params.put("id", productId);
Response response = network.postResponse(params, BasicConfig.MANAGER_oto_productUpdateStatus);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_productUpdateStatus,"下架公司产品失败",response.body().asString()));
}
@Test(description = "产品下架后公司产品列表不显示",priority = 40)
public void 产品下架后公司产品列表不显示() {
otoSellerTku();
String encodeProductId = IdMakeUtil.encodingId(productId);
Response response = network.postResponse(BasicConfig.PHONE_listBysellComp);
int size = response.jsonPath().getJsonObject("data.findAll{it.id == "+encodeProductId+"}.size()");
Assert.assertEquals(size,0,network.message(BasicConfig.PHONE_listBysellComp,"产品列表未包含已上架产品",response.body().asString()));
HashMap<String,Object> params = new HashMap<>();
params.put("id", productId);
response = network.postResponse(params, BasicConfig.MANAGER_oto_productUpdateStatus);
boolean data = response.jsonPath().getBoolean("data");
}
@Test(description = "上传普通面访详情",priority = 41)
public void 上传普通面访详情(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewIds.get(0));
params.put("interviewRemark", "第一次普通参观");
params.put("coreMaker", 1);
params.put("followWeight", 2);
params.put("commitPlanFlag", 1);
params.put("commitCustStatus", 1);
params.put("commitInsure", 1);
params.put("productId", IdMakeUtil.encodingId(productId));
params.put("insApplicant", 1);
params.put("insByApplicant", 1);
params.put("insPeriod", 3);
params.put("insMoney", 3);
params.put("isNormal", true);
Response response = network.postResponse(params, BasicConfig.PHONE_interviewFeedback);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertTrue(success,network.message(params,BasicConfig.WORK_delCust,"上传面访失败",response.body().asString()));
}
@Test(description = "客户流程组_表格总览更新为当下成交",priority = 42)
public void 客户流程组_表格总览更新为当下成交(){
otosellerAuth();
sleep(2000);
Response response = network.getResponse(BasicConfig.WORK_staticChart);
int fourStep = response.jsonPath().getInt("data[3].custNum");
Assert.assertEquals(fourStep,Work.chart.get("fourStep")+1,network.message(BasicConfig.WORK_staticChart,"客户社区参观后已确认投保要素流程组状态未变为4",response.body().asString()));
HashMap<String,Object> params = new HashMap<>();
params.put("custId", IdMakeUtil.decodingId(cust_id));
response = network.getResponse(params,BasicConfig.WORK_detail);
int custFlow = response.jsonPath().getInt("data.custInfo.custFlow");
int commitInsure = response.jsonPath().getInt("data.custInfo.commitInsure");
int commitPlanFlag = response.jsonPath().getInt("data.custInfo.commitPlanFlag");
Assert.assertEquals(custFlow,4,network.message(params,BasicConfig.WORK_detail,"新客户流程组状态错误非0",response.body().asString()));
Assert.assertEquals(commitInsure,1,network.message(params,BasicConfig.WORK_detail,"新客户提交计划书状态错误非0",response.body().asString()));
Assert.assertEquals(commitPlanFlag,1,network.message(params,BasicConfig.WORK_detail,"新客户投保要素确认状态错误非0",response.body().asString()));
}
@Test(description = "修改客户基础信息",priority = 43)
public void 修改客户基础信息(){
HashMap<String,Object> params = new HashMap<>();
ArrayList<Integer> array = new ArrayList<>();
params.put("custId", IdMakeUtil.decodingId(cust_id));
params.put("dealFlag", 1);
params.put("dealNumber", "ZDHCSBD000001");
params.put("custName", "自动化测试用户");
Response response = network.postResponse(params,BasicConfig.WORK_edit);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_edit,"修改客户基础信息失败",response.body().asString()));
}
@Test(description = "客户流程组_表格总览更新为已成单",priority = 44)
public void 客户流程组_表格总览更新为已成单(){
sleep(2000);
Response response = network.getResponse(BasicConfig.WORK_staticChart);
int fiveStep = response.jsonPath().getInt("data[4].custNum");
Assert.assertEquals(fiveStep,Work.chart.get("fiveStep")+1,network.message(BasicConfig.WORK_staticChart,"修改已成交后流程组状态未变为5",response.body().asString()));
HashMap<String,Object> params = new HashMap<>();
params.put("custId", IdMakeUtil.decodingId(cust_id));
response = network.getResponse(params,BasicConfig.WORK_detail);
int custFlow = response.jsonPath().getInt("data.custInfo.custFlow");
int dealFlag = response.jsonPath().getInt("data.custInfo.dealFlag");
String dealNumber = response.jsonPath().getString("data.custInfo.dealNumber");
Assert.assertEquals(custFlow,5,network.message(params,BasicConfig.WORK_detail,"新客户流程组状态错误非0",response.body().asString()));
Assert.assertEquals(dealFlag,1,network.message(params,BasicConfig.WORK_detail,"新客户提交计划书状态错误非0",response.body().asString()));
Assert.assertEquals(dealNumber,"ZDHCSBD000001",network.message(params,BasicConfig.WORK_detail,"新客户投保要素确认状态错误非0",response.body().asString()));
}
@Test(description = "销售任务_销售完成任务",priority = 45)
public void 销售任务_销售完成任务(){
//销售完成面访,跟进时间更新,联系新客户任务完成
HashMap<String,Object> params = new HashMap<>();
params.put("taskConfId",4); //任务配置id,4:联系未跟进的客户,5:复拨未接通的客户,6:超过N天未跟进的客户
params.put("pageIndex",1);
params.put("pageSize",20);
Response response = network.getResponse(params,BasicConfig.WORK_taskDetailsList);
int finishCustNum = response.jsonPath().getInt("data.finishCustNum");
Assert.assertTrue(finishCustNum>0,network.message(params,BasicConfig.WORK_taskDetailsList,"已完成数量记录错误",response.body().asString()));
}
@Test(description = "查看我的预约列表",priority = 46)
public void 查看我的预约列表(){
agent2Tku();
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex",1);
params.put("pageSize",20);
Response response =network.getResponse(params,BasicConfig.PHONE_getReservationList);
int bookingStatus = response.jsonPath().getInt("data[0].bookingStatus");
Assert.assertEquals(bookingStatus,1,network.message(BasicConfig.PHONE_getReservationList,"订单状态未更新为已参观",response.body().asString()));
}
@Test(description = "删除客户",priority = 79)
public void 删除客户(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", IdMakeUtil.decodingId(cust_id));
Response response = network.postResponse(params,BasicConfig.WORK_delCust);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_delCust,"删除客户失败",response.body().asString()));
params.put("custId", IdMakeUtil.decodingId(introduceCustomer_id));
response = network.postResponse(params,BasicConfig.WORK_delCust);
data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_delCust,"删除客户失败",response.body().asString()));
params.put("custId", IdMakeUtil.decodingId(myselfCustomer_id));
response = network.postResponse(params,BasicConfig.WORK_delCust);
data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_delCust,"删除客户失败",response.body().asString()));
}
@Test(description = "删除客户填写的表单记录",priority = 80)
public void 删除客户填写的表单记录(){
HashMap<String,Object> params = new HashMap<>();
params.put("phoneNum", phone);
Response response = network.postResponse(params,BasicConfig.WORK_delPubFormRecord);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_delPubFormRecord,"删除客户表单记录失败",response.body().asString()));
}
@Test(description = "退出登录",priority = 81)
public void 退出登录(){
Response response = network.postResponse(BasicConfig.WORK_logout);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(BasicConfig.WORK_logout,"退出登录失败",response.body().asString()));
}
public void scanCode(String scanCodeId,int scanCodeType) {
HashMap<String,Object> params = new HashMap<>();
params.put("scanCodeId", scanCodeId);
params.put("scanCodeType", scanCodeType);
Response response = network.postResponse(params, BasicConfig.PHONE_bindWxUser);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.PHONE_bindWxUser,"扫码绑定失败",response.body().asString()));
}
public void interviewCancle(String interviewId){
HashMap<String,Object> params = new HashMap<>();
params.put("id", interviewId);
Response response = network.postResponse(params, BasicConfig.PHONE_interviewCancel);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_delCust,"取消面访失败",response.body().asString()));
}
}
package com.oto.cases.otoseller;
import com.oto.cases.admin.Authorization;
import com.oto.config.BasicConfig;
import com.oto.utils.NetworkUtils;
import io.restassured.response.Response;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.util.*;
import static com.oto.config.BasicConfig.*;
import static com.oto.utils.BaseUtils.*;
import static com.oto.utils.ThreadSleepUtils.sleep;
public class Work implements Authorization {
private static final NetworkUtils network = NetworkUtils.getInstance();
public int tagId; //标签ID
public int custId; //客户ID
public static String phone = "13705566425"; //客户手机号
public int followTimes; //跟进次数
public static Map<String,Integer> header;
public static Map<String,Integer> chart;
@BeforeTest
public void setUp(){
header = new HashMap<>();
chart = new HashMap<>();
otoSellerLogin();
otoLeaderLogin();
otoManagerLogin();
ssoLogin();
}
@Test(description = "公域引流_创建标签",priority = 1)
public void 公域引流_创建标签(){
HashMap<String,Object> params = new HashMap<>();
params.put("tagName", "勿动-自动化测试标签");
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_saveTag);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_saveTag,"创建标签失败",response.body().asString()));
//创建名称相同的标签失败
response = network.postResponse(params,BasicConfig.MANAGER_oto_saveTag);
data = response.jsonPath().getBoolean("success");
Assert.assertFalse(data,network.message(params,BasicConfig.MANAGER_oto_saveTag,"创建同名的标签成功",response.body().asString()));
}
@Test(description = "公域引流_查看标签列表",priority = 2)
public void 公域引流_查看标签列表(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 20);
Response response = network.getResponse(params,BasicConfig.MANAGER_oto_tagList);
int size = response.jsonPath().getInt("data.list.size()");
String tagName = response.jsonPath().getString("data.list[0].tagName");
int customerCount = response.jsonPath().getInt("data.list[0].customerCount");
int tagStatus = response.jsonPath().getInt("data.list[0].tagStatus");
Assert.assertTrue(size>0 ,network.message(BasicConfig.MANAGER_oto_tagList,"标签列表为空",response.body().asString()));
Assert.assertEquals(tagName ,"勿动-自动化测试标签",network.message(params,BasicConfig.MANAGER_oto_tagList,"标签名称错误",response.body().asString()));
Assert.assertEquals(customerCount ,0,network.message(params,BasicConfig.MANAGER_oto_tagList,"新标签的客户数不为0",response.body().asString()));
Assert.assertEquals(tagStatus ,1,network.message(params,BasicConfig.MANAGER_oto_tagList,"新标签的状态不为打开",response.body().asString()));
tagId = response.jsonPath().getInt("data.list[0].id");
}
@Test(description = "公域引流_修改标签",priority = 3)
public void 公域引流_修改标签(){
HashMap<String,Object> params = new HashMap<>();
params.put("tagName", "勿动-自动化更新标签");
params.put("id", tagId);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_updateTag);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_updateTag,"修改标签失败",response.body().asString()));
}
@Test(description = "公域引流_填写表单",priority = 4)
public void 公域引流_填写表单(){
HashMap<String,Object> params = new HashMap<>();
params.put("formId", "Kj20ODA3");
params.put("phoneNum", phone);
params.put("urlLink", "https://kjj-static.duibatest.com.cn/cpic-home/202111261430?formId=Kj20ODA3&channel=bd&agent=x");
params.put("username", "自动化测试用户");
params.put("uuid", "622d83e4-ca21-4ccd-94cb-182c0f2a6b60");
Response response = network.postResponse(params,BasicConfig.FORM_submit);
String recordId = response.jsonPath().getString("data.recordId");
Assert.assertNotNull(recordId,network.message(params,BasicConfig.FORM_submit,"客户创建失败",response.body().asString()));
params.clear();
ArrayList<String> optionIds = new ArrayList<>();
optionIds.add("Kj21NTY1OTE");
params.put("optionIds", optionIds);
params.put("questionId", "Kj21MjQ5Njc");
params.put("recordId", recordId);
response = network.postResponse(params,BasicConfig.FORM_submitQuestion);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.FORM_submitQuestion,"客户填写表单失败",response.body().asString()));
}
@Test(description = "公域引流_查找客户",priority = 5)
public void 公域引流_查找客户(){
HashMap<String,Object> params = new HashMap<String,Object>();
params.put("pageIndex", 1);
params.put("pageSize", 10);
params.put("phoneNum", phone);
Response response = network.getResponse(params,BasicConfig.MANAGER_oto_customerList);
int totalCount = response.jsonPath().getInt("data.totalCount");
Assert.assertTrue(totalCount == 1,network.message(params,BasicConfig.MANAGER_oto_customerList,"未查找到该客户",response.body().asString()));
String custName = response.jsonPath().getString("data.list[0].custName");
Assert.assertEquals(custName,"自动化测试用户",network.message(params,BasicConfig.MANAGER_oto_customerList,"未查找到该客户",response.body().asString()));
custId = response.jsonPath().getInt("data.list[0].id");
}
@Test(description = "公域引流_分配客户",priority = 6)
public void 公域引流_分配客户(){
HashMap<String,Object> params = new HashMap<>();
String str= String.valueOf(System.currentTimeMillis());
params.put("customerId",custId);
params.put("sellerId", SELLER_ID);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_assignSeller);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_assignSeller,"分配客户失败",response.body().asString()));
}
@Test(description = "工作台_销售信息",priority = 7)
public void 客户分类_销售信息(){
otosellerAuth();
Response response = network.getResponse(BasicConfig.WORK_userInfo);
String sellerName = response.jsonPath().getString("data.sellerName");
Assert.assertEquals(sellerName,"勿动-自动化测试销售",network.message(BasicConfig.WORK_userInfo,"销售姓名错误",response.body().asString()));
}
@Test(description = "工作台_通知栏",priority = 8)
public void 工作台_通知栏(){
Response response = network.getResponse(BasicConfig.WORK_notifyList);
int size = response.jsonPath().getInt("data.size()");
Assert.assertEquals(size,1,network.message(BasicConfig.WORK_notifyList,"通知栏不为空",response.body().asString()));
int notifyType = response.jsonPath().getInt("data[0].notifyType");
int custCount = response.jsonPath().getInt("data[0].custCount");
Assert.assertEquals(custCount,1,network.message(BasicConfig.WORK_notifyList,"客户数量错误",response.body().asString()));
Assert.assertEquals(notifyType,2,network.message(BasicConfig.WORK_notifyList,"通知栏类型错误",response.body().asString()));
}
@Test(description = "客户状态分类_数量总览",priority = 9)
public void 客户状态分类_数量总览(){
Response response = network.getResponse(BasicConfig.WORK_staticHeader);
Object data = response.jsonPath().getJsonObject("data");
Assert.assertNotNull(data,network.message(BasicConfig.WORK_staticHeader,"数量总览数据为空",response.body().asString()));
int starNum = response.jsonPath().getInt("data.starNum");
int totalNum = response.jsonPath().getInt("data.totalNum");
int unContactNum = response.jsonPath().getInt("data.unContactNum");
int unMeetNum = response.jsonPath().getInt("data.unMeetNum");
int unRedialNum = response.jsonPath().getInt("data.unRedialNum");
int willRecycleCustNum = response.jsonPath().getInt("data.willRecycleCustNum");
header.put("starNum",starNum);
header.put("totalNum",totalNum);
header.put("unContactNum",unContactNum);
header.put("unMeetNum",unMeetNum);
header.put("unRedialNum",unRedialNum);
header.put("willRecycleCustNum",willRecycleCustNum);
}
@Test(description = "客户流程组_表格总览",priority = 10)
public void 客户流程组_表格总览(){
Response response = network.getResponse(BasicConfig.WORK_staticChart);
Object data = response.jsonPath().getJsonObject("data");
Assert.assertNotNull(data,network.message(BasicConfig.WORK_staticChart,"流程组表格数量为空",response.body().asString()));
chart.put("ondStep",response.jsonPath().getInt("data[0].custNum"));
chart.put("twoStep",response.jsonPath().getInt("data[1].custNum"));
chart.put("threeStep",response.jsonPath().getInt("data[2].custNum"));
chart.put("fourStep",response.jsonPath().getInt("data[3].custNum"));
chart.put("fiveStep",response.jsonPath().getInt("data[4].custNum"));
}
@Test(description = "工作台_标签列表",priority = 11)
public void 工作台_标签列表(){
Response response = network.getResponse(BasicConfig.WORK_tagList);
String tagName = response.jsonPath().getString("data.find{it.tagId =="+tagId+"}.tagName");
Assert.assertEquals(tagName,"勿动-自动化更新标签",network.message(BasicConfig.WORK_tagList,"跟进表格数量为空",response.body().asString()));
}
@Test(description = "需要联系客户列表",priority = 12)
public void 需要联系客户列表(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 10);
params.put("custClassifyType", 1);
Response response = network.getResponse(params,BasicConfig.WORK_customerList);
int customerId = response.jsonPath().getInt("data.list[0].custId");
Assert.assertEquals(customerId,custId,network.message(params,BasicConfig.WORK_customerList,"需要联系列表中首位客户非新增客户",response.body().asString()));
int custStar = response.jsonPath().getInt("data.list[0].custStar");
followTimes = response.jsonPath().getInt("data.list[0].followTimes");
Object custValue = response.jsonPath().getJsonObject("data.list[0].custValue");
Object lastFollowTime = response.jsonPath().getJsonObject("data.list[0].lastFollowTime");
Assert.assertEquals(custStar,0,network.message(params,BasicConfig.WORK_customerList,"新客户默认为星标客户",response.body().asString()));
Assert.assertEquals(followTimes,0,network.message(params,BasicConfig.WORK_customerList,"新客户的默认跟进次数不为0",response.body().asString()));
Assert.assertNull(custValue,network.message(params,BasicConfig.WORK_customerList,"新客户的默认客户价值不为null",response.body().asString()));
Assert.assertNull(lastFollowTime,network.message(params,BasicConfig.WORK_customerList,"新客户的默认跟进时间不为null",response.body().asString()));
}
@Test(description = "查询客户手机号",priority = 13)
public void 查询客户手机号(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
Response response = network.getResponse(params,BasicConfig.WORK_phone);
String data = response.jsonPath().getString("data");
Assert.assertEquals(data,phone,network.message(params,BasicConfig.WORK_phone,"手机号错误",response.body().asString()));
}
@Test(description = "查询新客户见面情况",priority = 14)
public void 查询新客户见面情况(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
Response response = network.getResponse(params,BasicConfig.WORK_info);
boolean todayMeetFlag = response.jsonPath().getBoolean("data.todayMeetFlag");
boolean orderVisitFlag = response.jsonPath().getBoolean("data.orderVisitFlag");
Object orderVisitDate = response.jsonPath().getJsonObject("data.orderVisitDate");
Assert.assertFalse(todayMeetFlag,network.message(params,BasicConfig.WORK_info,"今日见面状态错误:为已见面",response.body().asString()));
Assert.assertFalse(orderVisitFlag,network.message(params,BasicConfig.WORK_info,"预约参观状态错误:为已预约",response.body().asString()));
Assert.assertNull(orderVisitDate,network.message(params,BasicConfig.WORK_info,"预约时间不为空",response.body().asString()));
}
@Test(description = "查询新客户头部信息",priority = 15)
public void 查询新客户头部信息(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
Response response = network.getResponse(params,BasicConfig.WORK_header);
Object data = response.jsonPath().getJsonObject("data");
Assert.assertNotNull(data,network.message(params,BasicConfig.WORK_header,"头部信息为空",response.body().asString()));
}
@Test(description = "查询新客户详细信息",priority = 16)
public void 查询新客户详细信息(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
Response response = network.getResponse(params,BasicConfig.WORK_detail);
int custFlow = response.jsonPath().getInt("data.custInfo.custFlow");
int commitInsure = response.jsonPath().getInt("data.custInfo.commitInsure");
int commitPlanFlag = response.jsonPath().getInt("data.custInfo.commitPlanFlag");
Assert.assertEquals(custFlow,1,network.message(params,BasicConfig.WORK_detail,"新客户流程组状态错误非1",response.body().asString()));
Assert.assertEquals(commitInsure,0,network.message(params,BasicConfig.WORK_detail,"新客户提交计划书状态错误非0",response.body().asString()));
Assert.assertEquals(commitPlanFlag,0,network.message(params,BasicConfig.WORK_detail,"新客户投保要素确认状态错误非0",response.body().asString()));
}
@Test(description = "查询客户电话表单回填状态",priority = 17)
public void 查询客户电话表单回填状态(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
Response response = network.getResponse(params,BasicConfig.WORK_showFeedback);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertFalse(data,network.message(params,BasicConfig.WORK_showFeedback,"电话表单回填状态错误:为需要回填",response.body().asString()));
}
@Test(description = "查询省市列表",priority = 18)
public void 查询省市列表(){
Response response = network.getResponse(BasicConfig.WORK_regionCity);
Object data = response.jsonPath().getJsonObject("data");
Assert.assertNotNull(data,network.message(BasicConfig.WORK_regionCity,"省市列表为空",response.body().asString()));
}
@Test(description = "查询历史通话",priority = 19)
public void 查询历史通话(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
params.put("logDays", 1);
Response response = network.getResponse(params,BasicConfig.WORK_callLog);
Object data = response.jsonPath().getJsonObject("data");
Assert.assertNotNull(data,network.message(params,BasicConfig.WORK_callLog,"历史通话为空",response.body().asString()));
}
@Test(description = "修改客户跟进权重",priority = 24)
public void 修改客户跟进权重(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
params.put("followWeight", 1);
Response response = network.postResponse(params,BasicConfig.WORK_weight);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_weight,"修改客户跟进权重失败",response.body().asString()));
}
@Test(description = "修改客户标签",priority = 25)
public void 修改客户标签(){
HashMap<String,Object> params = new HashMap<>();
ArrayList<Integer> tags = new ArrayList<>();
tags.add(tagId);
params.put("custId", custId);
params.put("tagIds", tags);
Response response = network.postResponse(params,BasicConfig.WORK_tag);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_tag,"修改客户标签失败",response.body().asString()));
//查询信息更新
params.clear();
params.put("custId", custId);
response = network.getResponse(params,BasicConfig.WORK_detail);
int tagSize = response.jsonPath().getInt("data.custInfo.tagIds.size()");
Assert.assertEquals(tagSize,1,network.message(params,BasicConfig.WORK_detail,"标签数量错误",response.body().asString()));
int tId = response.jsonPath().getInt("data.custInfo.tagIds[0]");
Assert.assertEquals(tId,tagId,network.message(params,BasicConfig.WORK_detail,"标签Id错误",response.body().asString()));
}
@Test(description = "修改标签状态为关闭",priority = 26)
public void 修改标签状态为关闭(){
ssoLogin();
HashMap<String,Object> params = new HashMap<>();
params.put("id", tagId);
params.put("tagStatus", 0);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_switchStatus);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_switchStatus,"关闭标签显示失败",response.body().asString()));
}
@Test(description = "查询更新的标签列表和客户标签",priority = 27)
public void 查询更新的标签列表和客户标签(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
Response response = network.getResponse(params,BasicConfig.WORK_detail);
Object tagIds = response.jsonPath().getJsonObject("data.custInfo.tagIds");
Assert.assertNull(tagIds,network.message(params,BasicConfig.WORK_detail,"标签数量错误",response.body().asString()));
response = network.getResponse(BasicConfig.WORK_tagList);
int size = response.jsonPath().getInt("data.findAll{it.tagId =="+tagId+"}.size()");
Assert.assertEquals(size,0,network.message(BasicConfig.WORK_tagList,"跟进表格数量为空",response.body().asString()));
params.clear();
sleep(1000);
params.put("pageIndex", 1);
params.put("pageSize", 20);
response = network.getResponse(params,BasicConfig.MANAGER_oto_tagList);
int customerCount = response.jsonPath().getInt("data.list[0].customerCount");
Assert.assertEquals(customerCount ,1,network.message(params,BasicConfig.MANAGER_oto_tagList,"标签的客户数不为1",response.body().asString()));
}
@Test(description = "修改标签状态为开启",priority = 28)
public void 修改标签状态为开启() {
ssoLogin();
HashMap<String, Object> params = new HashMap<>();
params.put("id", tagId);
params.put("tagStatus", 1);
Response response = network.postResponse(params, BasicConfig.MANAGER_oto_switchStatus);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_switchStatus,"修改客户标签失败",response.body().asString()));
}
@Test(description = "删除客户标签",priority = 29)
public void 删除客户标签() {
HashMap<String,Object> params = new HashMap<>();
ArrayList<Integer> tags = new ArrayList<>();
params.put("custId", custId);
params.put("tagIds", tags);
Response response = network.postResponse(params,BasicConfig.WORK_tag);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_tag,"修改客户标签失败",response.body().asString()));
//校验还原
params.clear();
params.put("custId", custId);
response = network.getResponse(params,BasicConfig.WORK_detail);
Object tagIds = response.jsonPath().getJsonObject("data.custInfo.tagIds");
Assert.assertNull(tagIds,network.message(params,BasicConfig.WORK_detail,"标签数量错误",response.body().asString()));
response = network.getResponse(BasicConfig.WORK_tagList);
int size = response.jsonPath().getInt("data.findAll{it.tagId =="+tagId+"}.size()");
Assert.assertEquals(size,1,network.message(BasicConfig.WORK_tagList,"跟进表格数量为空",response.body().asString()));
}
@Test(description = "修改客户基础信息",priority = 37)
public void 修改客户基础信息(){
HashMap<String,Object> params = new HashMap<>();
ArrayList<Integer> array = new ArrayList<>();
params.put("custId", custId);
params.put("commitPlanFlag", 0);
params.put("addWxStatus", 0);
params.put("coreMaker", 1);
params.put("ideaAgree", 1);
params.put("insApplicant", 4);
params.put("insByApplicant", 4);
params.put("insMoney", 500);
params.put("insPeriod", 20);
params.put("custArea", "北京-北京市");
params.put("custDescription", "客户的备注");
params.put("custName", "自动化测试用户");
params.put("dealFlag", 0);
params.put("forWho", array);
params.put("retireMoney", 0);
params.put("roomerAge", 0);
params.put("roomerCity", "");
params.put("visitOrg", array);
Response response = network.postResponse(params,BasicConfig.WORK_edit);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_edit,"修改客户基础信息失败",response.body().asString()));
}
@Test(description = "查看客户动态",priority = 39)
public void 查看客户动态(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
params.put("logDays", 1);
Response response = network.getResponse(params,BasicConfig.WORK_operation);
int logSize = response.jsonPath().getInt("data.list[0].dayLog.size()");
Assert.assertTrue(logSize>0,network.message(params,BasicConfig.WORK_operation,"客户动态条数错误",response.body().asString()));
}
@Test(description = "姓名模糊查找客户",priority = 40)
public void 姓名模糊查找客户(){
HashMap<String,Object> params = new HashMap<>();
params.put("custName", "自动化");
Response response = network.getResponse(params,BasicConfig.WORK_fuzzyCustName);
int size = response.jsonPath().getInt("data.size()");
Assert.assertTrue(size>0,network.message(params,BasicConfig.WORK_fuzzyCustName,"客户动态条数错误",response.body().asString()));
}
@Test(description = "公域引流_删除标签",priority = 41)
public void 公域引流_删除标签(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", tagId);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_deleteTag);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_deleteTag,"删除标签失败",response.body().asString()));
params.clear();
params.put("pageIndex", 1);
params.put("pageSize", 20);
response = network.getResponse(params,BasicConfig.MANAGER_oto_tagList);
int id = response.jsonPath().getInt("data.list[0].id");
Assert.assertTrue(id!= tagId ,network.message(params,BasicConfig.MANAGER_oto_tagList,"新标签的状态不为打开",response.body().asString()));
}
@Test(description = "公域引流_关闭销售呼叫权限",priority = 42)
public void 公域引流_关闭销售呼叫权限(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", SELLER_ID);
params.put("callPermission", 0);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_switchCallPermissio);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_switchCallPermissio,"关闭呼叫权限失败",response.body().asString()));
}
@Test(description = "关闭呼叫权限_呼叫失败",priority = 43)
public void 关闭呼叫权限_呼叫失败(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
Response response = network.postResponse(params,BasicConfig.WORK_call);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(params,BasicConfig.WORK_call,"关闭呼叫权限后呼叫成功",response.body().asString()));
params.clear();
params.put("id", SELLER_ID);
params.put("callPermission", 1);
response = network.postResponse(params,BasicConfig.MANAGER_oto_switchCallPermissio);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_switchCallPermissio,"关闭呼叫权限失败",response.body().asString()));
}
@Test(description = "公域引流_禁用销售账号",priority = 44)
public void 公域引流_禁用销售账号(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", SELLER_ID);
params.put("sellerStatus", 0);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_switchSellerStatus);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_switchSellerStatus,"禁用销售账号失败",response.body().asString()));
}
@Test(description = "关闭销售权限_访问失败",priority = 45)
public void 关闭销售权限_访问失败(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 10);
params.put("custClassifyType", 1);
Response response = network.getResponse(params,BasicConfig.WORK_customerList);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(params,BasicConfig.WORK_customerList,"关闭销售权限后访问成功",response.body().asString()));
params.clear();
params.put("id", SELLER_ID);
params.put("sellerStatus", 1);
response = network.postResponse(params,BasicConfig.MANAGER_oto_switchSellerStatus);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.MANAGER_oto_switchSellerStatus,"启用销售账号失败",response.body().asString()));
}
@Test(description = "公域引流_解密客户手机号",priority = 46)
public void 公域引流_解密客户手机号(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", custId);
params.put("pageIndex", 1);
params.put("pageSize", 10);
Response response = network.getResponse(params,BasicConfig.MANAGER_oto_customerPhone);
String data = response.jsonPath().getString("data");
Assert.assertEquals(data,phone,network.message(params,BasicConfig.MANAGER_oto_qaDetail,"解密手机号失败",response.body().asString()));
}
@Test(description = "公域引流_查询问题详情",priority = 47)
public void 公域引流_查询问题详情(){
HashMap<String,Object> params = new HashMap<>();
params.put("customerId", custId);
Response response = network.getResponse(params,BasicConfig.MANAGER_oto_qaDetail);;
int answer = response.jsonPath().getInt("data.list[0].optionTitles.size()");
Assert.assertTrue(answer>0,network.message(params,BasicConfig.MANAGER_oto_customerPhone,"问题详情为空",response.body().asString()));
}
@Test(description = "放弃客户进入回收池",priority = 48)
public void 放弃客户进入回收池(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
params.put("abandonReasonType", 3);
params.put("abandonRemark", "放弃原因"+new Date());
Response response = network.postResponse(params,BasicConfig.WORK_abandonCust);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_abandonCust,"放弃客户失败",response.body().asString()));
}
@Test(description = "查询投放池刷新配置",priority = 49)
public void 查询投放池刷新配置(){
Response response = network.getResponse(BasicConfig.WORK_leadsConfig);
int dayAssignLimit = response.jsonPath().getInt("data.dayAssignLimit");
Assert.assertNotNull(dayAssignLimit,network.message(BasicConfig.WORK_leadsConfig,"查询投放池刷新配置失败",response.body().asString()));
}
@Test(description = "查看投放池客户列表",priority = 50)
public void 查看投放池客户列表(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 20);
Response response = network.getResponse(params,BasicConfig.WORK_freshList);
Object list = response.jsonPath().getJsonObject("data.list");
Assert.assertNotNull(list,network.message(params,BasicConfig.WORK_freshList,"查看投放池客户不为空",response.body().asString()));
}
@Test(description = "查看回收池客户列表",priority = 51)
public void 查看回收池客户列表(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 20);
Response response = network.getResponse(params,BasicConfig.WORK_recycleList);
int size = response.jsonPath().getInt("data.list.size()");
Assert.assertTrue(size>0,network.message(params,BasicConfig.WORK_recycleList,"查看回收池客户列表为空",response.body().asString()));
int result = response.jsonPath().getInt("data.list.findAll{it.custId == "+custId+"}.size()");
Assert.assertEquals(result,1,network.message(params,BasicConfig.WORK_recycleList,"回收池客户列表不包含刚刚的回收客户",response.body().asString()));
}
@Test(description = "认领回收池客户",priority = 52)
public void 认领回收池客户(){
sleep(2000);
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
Response response = network.postResponse(params,BasicConfig.WORK_claim);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_claim,"删除客户失败",response.body().asString()));
}
@Test(description = "客户总数更新",priority = 53)
public void 客户总数更新(){
sleep(1000);
Response response = network.getResponse(BasicConfig.WORK_staticHeader);
int totalNum = response.jsonPath().getInt("data.totalNum");
int num = header.get("totalNum");
Assert.assertEquals(totalNum, num,network.message(BasicConfig.WORK_staticChart,"客户总数未更新",response.body().asString()));
}
@Test(description = "查询认领客户评价清空",priority = 54)
public void 查询认领客户评价清空(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId", custId);
Response response = network.getResponse(params,BasicConfig.WORK_header);
Object custValue = response.jsonPath().getJsonObject("data.custValue");
Object followWeight = response.jsonPath().getJsonObject("data.followWeight");
Assert.assertNull(custValue,network.message(params,BasicConfig.WORK_header,"客户价值未清空",response.body().asString()));
Assert.assertNull(followWeight,network.message(params,BasicConfig.WORK_header,"客户权重未清空",response.body().asString()));
}
@Test(description = "总监查看名下销售列表",priority = 55)
public void 总监查看名下销售列表(){
otoLeaderAuth();
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 10);
Response response = network.getResponse(params, BasicConfig.WORK_attendanceList);
int size = response.jsonPath().getInt("data.list.size()");
Assert.assertEquals(size,1,network.message(params,BasicConfig.WORK_attendanceList,"总监名下销售列表为空",response.body().asString()));
}
@Test(description = "总监修改名下销售工作状态",priority = 56)
public void 总监修改名下销售工作状态(){
HashMap<String,Object> params = new HashMap<>();
params.put("sellerId", SELLER_ID);
params.put("workStatus", 0);
Response response = network.postResponse(params, BasicConfig.WORK_switchWorkStatus);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(BasicConfig.WORK_logout,"总监修改名下销售工作状态失败",response.body().asString()));
}
@Test(description = "总监修改非名下销售工作状态",priority = 57)
public void 总监修改非名下销售工作状态(){
HashMap<String,Object> params = new HashMap<>();
params.put("sellerId", 1);
params.put("workStatus", 0);
Response response = network.postResponse(params, BasicConfig.WORK_switchWorkStatus);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(BasicConfig.WORK_logout,"总监修改非名下销售工作状态成功",response.body().asString()));
}
@Test(description = "销售间客户动态取消隔离",priority = 58)
public void 销售间客户动态取消隔离(){
//将客户重新分配给总监
HashMap<String,Object> params = new HashMap<>();
params.put("customerId",custId);
params.put("sellerId",LEADER_ID);
Response response = network.postResponse(params,BasicConfig.MANAGER_oto_assignSeller);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(BasicConfig.MANAGER_oto_assignSeller,"重新分配失败",response.body().asString()));
//总监查看客户动态
params.clear();
params.put("custId",custId);
params.put("logDays",1);
Response logRes = network.getResponse(params,BasicConfig.WORK_operation);
int logSize = logRes.jsonPath().getInt("data.list.size()");
Assert.assertTrue(logSize>0,network.message(BasicConfig.WORK_operation,"客户动态隔离失败",logRes.body().asString()));
//还原
params.clear();
params.put("customerId",custId);
params.put("sellerId",SELLER_ID);
response = network.postResponse(params,BasicConfig.MANAGER_oto_assignSeller);
}
@Test(description = "关闭总监的新客户认领权限和回收客户认领权限",priority = 59)
public void 关闭总监的新客户认领权限和回收客户认领权限(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", LEADER_ID);
params.put("sellerStatus", 1);
params.put("callPermission", 1);
params.put("assignNewCustPermission", 0);
params.put("assignRecycleCustPermission", 0);
Response response = network.postResponse(params, BasicConfig.MANAGER_oto_updatePermission);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertTrue(success,network.message(BasicConfig.MANAGER_oto_updatePermission,"关闭总监的新客户认领权限和回收客户认领权限失败",response.body().asString()));
}
@Test(description = "无新客户认领权限不可查看新客户列表",priority = 60)
public void 无新客户认领权限不可查看新客户列表(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 20);
Response response = network.getResponse(params,BasicConfig.WORK_freshList);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(BasicConfig.WORK_logout,"无新客户认领权限可查看新客户列表",response.body().asString()));
}
@Test(description = "无回收客户认领权限不可查看回收客户列表",priority = 61)
public void 无回收客户认领权限不可查看回收客户列表(){
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex", 1);
params.put("pageSize", 20);
Response response = network.getResponse(params,BasicConfig.WORK_recycleList);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertFalse(success,network.message(BasicConfig.WORK_logout,"无回收客户认领权限可查看回收客户列表",response.body().asString()));
}
@Test(description = "开启总监的新客户认领权限和回收客户认领权限",priority = 62)
public void 开启总监的新客户认领权限和回收客户认领权限(){
HashMap<String,Object> params = new HashMap<>();
params.put("id", LEADER_ID);
params.put("sellerStatus", 1);
params.put("callPermission", 1);
params.put("assignNewCustPermission", 1);
params.put("assignRecycleCustPermission", 1);
Response response = network.postResponse(params, BasicConfig.MANAGER_oto_updatePermission);
boolean success = response.jsonPath().getBoolean("success");
Assert.assertTrue(success,network.message(BasicConfig.MANAGER_oto_updatePermission,"开启总监的新客户认领权限和回收客户认领权限失败",response.body().asString()));
}
@Test(description = "新建日程",priority = 63)
public void 新建日程(){
//获取日程提醒数量
Response listRes = network.getResponse(BasicConfig.WORK_notifyList);
int size = listRes.jsonPath().getInt("data.size()");
//新建日程
HashMap<String,Object> params = new HashMap<>();
params.put("custId",custId);
params.put("notifyTime",System.currentTimeMillis()+3600000);
params.put("type","phone");
Response scheduleRes =network.postResponse(params,BasicConfig.WORK_saveOrModifySchedule);
boolean success = scheduleRes.jsonPath().getBoolean("data");
Assert.assertTrue(success,network.message(BasicConfig.WORK_saveOrModifySchedule,"新建日程失败",scheduleRes.body().asString()));
//日程通知数量增加
Response listRes2 = network.getResponse(BasicConfig.WORK_notifyList);
int size2 = listRes2.jsonPath().getInt("data.size()");
Assert.assertTrue(size<size2,network.message(BasicConfig.WORK_notifyList,"日程通知未展示新建日程",listRes.body().asString()));
}
@Test(description = "取消日程",priority = 64)
public void 取消日程(){
HashMap<String,Object> params = new HashMap<>();
params.put("custId",custId);
Response response =network.postResponse(params,BasicConfig.WORK_cancelSchedule);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(BasicConfig.WORK_cancelSchedule,"取消日程失败",response.body().asString()));
}
@Test(description = "普通销售不可查看审批管理",priority = 65)
public void 普通销售不可查看审批管理(){
otosellerAuth();
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex",1);
params.put("pageSize",20);
Response response =network.getResponse(params,BasicConfig.WORK_interviewAuditList);
int size = response.jsonPath().getInt("data.list.size()");
Assert.assertEquals(size,0,network.message(BasicConfig.WORK_interviewAuditList,"查看审批列表不为空",response.body().asString()));
}
@Test(description ="获取任务管理列表",priority = 66)
public void 获取任务管理列表(){
otoManagerAuth();
Response response = network.getResponse(BasicConfig.WORK_taskConfList);
int size = response.jsonPath().getInt("data.size()");
Assert.assertTrue(size==3,network.message(BasicConfig.WORK_taskConfList,"获取任务配置数量错误",response.body().asString()));
}
@Test(description = "修改任务配置",priority = 67)
public void 修改任务配置(){
HashMap<String,Object> params = new HashMap<>();
List list = new ArrayList();
list.add(3);
list.add(4);
list.add(2);
params.put("custSourceList",list);//客户来源:1:缘故客户 2:转介绍客户 3:投放客户 4.直播客户 5.助手客户
params.put("custType",1); //1:全部客户;2:新客户;3:老客户
params.put("id",4);
params.put("limitGoalFlag",0);
params.put("taskUsable",0); //0:任务状态关闭;1:任务状态开启
Response response = network.postResponse(params,BasicConfig.WORK_modifyTaskConf);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data,network.message(params,BasicConfig.WORK_modifyTaskConf,"修改任务失败",response.body().asString()));
//获取任务列表验证修改是否成功
Response listRes = network.getResponse(BasicConfig.WORK_taskConfList);
int custType = listRes.jsonPath().getInt("data[0].custType");
Assert.assertEquals(custType,1,network.message(BasicConfig.WORK_taskConfList,"修改任务配置失败",listRes.body().asString()));
//恢复默认配置
params.clear();
List acqList = new ArrayList();
acqList.add(3);
acqList.add(4);
params.put("custSourceList",list);//客户来源:1:缘故客户 2:转介绍客户 3:投放客户 4.直播客户 5.助手客户
params.put("custType",2); //1:全部客户;2:新客户;3:老客户
params.put("id",4);
params.put("limitGoalFlag",0);
params.put("taskUsable",1); //0:任务状态关闭;1:任务状态开启
Response acqRes = network.postResponse(params,BasicConfig.WORK_modifyTaskConf);
boolean acqData = acqRes.jsonPath().getBoolean("data");
Assert.assertTrue(acqData,network.message(params,BasicConfig.WORK_modifyTaskConf,"修改任务失败",acqRes.body().asString()));
}
@Test(description = "客户总览_销售查看任务",priority = 68)
public void 销售查看任务(){
otosellerAuth();
sleep(2000);
Response response = network.getResponse(BasicConfig.WORK_statisticHeader);
int finishCustNum = response.jsonPath().getInt("data[0].finishCustNum");
System.out.println(finishCustNum);
Assert.assertEquals(finishCustNum,0,network.message(BasicConfig.WORK_statisticHeader,"销售任务统计错误",response.body().asString()));
}
@Test(description = "查看联系新客户任务明细",priority = 69)
public void 查看联系新客户任务明细(){
HashMap<String,Object> params = new HashMap<>();
params.put("taskConfId",4); //任务配置id,4:联系未跟进的客户,5:复拨未接通的客户,6:超过N天未跟进的客户
params.put("pageIndex",1);
params.put("pageSize",20);
Response response = network.getResponse(params,BasicConfig.WORK_taskDetailsList);
int finishCustNum = response.jsonPath().getInt("data.finishCustNum");
int listSize = response.jsonPath().getInt("data.list.size()");
Assert.assertEquals(finishCustNum,0,network.message(params,BasicConfig.WORK_taskDetailsList,"已完成数量记录错误",response.body().asString()));
Assert.assertTrue(listSize>0,network.message(params,BasicConfig.WORK_taskDetailsList,"待完成客户数统计错误",response.body().asString()));
}
@Test(description = "查看我的预约列表",priority = 70)
public void 查看我的预约列表(){
agent2Tku();
HashMap<String,Object> params = new HashMap<>();
params.put("pageIndex",1);
params.put("pageSize",20);
Response response =network.getResponse(params,BasicConfig.PHONE_getReservationList);
int size = response.jsonPath().getInt("data.size()");
Assert.assertEquals(size,1,network.message(BasicConfig.PHONE_getReservationList,"查看预约列表不为空",response.body().asString()));
int bookingStatus = response.jsonPath().getInt("data[0].bookingStatus");
Assert.assertEquals(bookingStatus,0,network.message(BasicConfig.PHONE_getReservationList,"预约状态错误:非待参观",response.body().asString()));
}
}
package com.oto.config;
public class BasicConfig {
// 是否开启钉钉机器人推送
public static final boolean isPushReport =true; //true
// 代理人微信昵称
public static final String WECHAT_NAME = "吉吉";
public static final String TKU_COOKIE_NAME = "tku";
// 销售工作台销售ID
public static final int SELLER_ID = 42;
// 销售工作台总监ID
public static final int LEADER_ID = 43;
/**
* 直播账号授权key
*/
/**
* 集客助手授权key
*/
// 基础线代理人 TKU,sid:2991
public static String AGENT_TKU = "T3gM31f18jCFEcfTyJdjfJAfSjDmKNMHfH7CvpLDC6UCLbai6Pc41VyJK3bXHe1wg7Hb5FGFZheeLvHjbE";
// 基础线访客 TKU---"请勿打扰"
public static String VISITOR_TKU = "T3gM31f18jCFYKzgBmWq2dVykia7XxAC7pfxunJPHQ6GF8C9jxgj97YaY5dvsAoBD4B2vrkezsvgm4xgpE";
// 基础线一级邀请访客(Ryan) sid:186
public static String VISITOR1_TKU = "2LYYwKJ1AqodGS5GJhJ9UU2CvroNP4oXBdXzWMjCXMZrpHnZQ6GNsAVoiDvyJbaiSVgzJGtkad6EnP4i";
// 基础线二级邀请访客(向日葵) sid:207
public static String VISITOR2_TKU = "2LYYwKJ1AqodEgCNM1c5ELXqhopphgtgqJgFo2jF3S9pexv9m2j5oGrwmxPuLHzuJfz1Rwb93FrZ1vmt";
// 基础线代理人(xxx),sid: 3844
public static String AGENT2_TKU = "T3gM31f18jCfGaPSWPdym4Tn1bVYCTxrdndNe7hfwWrSpFCcXxnzbW81VZG9nT2gT8MMB52bE2rguiXBDL";
// 访客(SuYi) userID:4425
public static String VISITOR_UserTku = "T3gM31f18jAW2hicRDxbwHFSuwA4MMVLLeHZ5G4yvb3sz6YRdcqKfzRJ8dMnfqDmgS8EprRjhFpXPFLBvp";
// 钉钉机器人 线上-告警群
public static final String dingTalkPath = "https://oapi.dingtalk.com/robot/send?access_token=e6fc528a3a5991ba74d800c9b1688bf5e0f4f88864ec92da777f84c260181407";
/*******OTO销售工作台*********/
public static final String OTO_TKU = "4yrzAfNog7WE527NKCNmqBqph48N7mWR9J49QYysZmKYC3DF97hQFap7RphynF3GFXLhp7GFZ35mc";
// *************** 客集集域名 ***************
public static final String HOST = "https://kjj.m.duibatest.com.cn";
public static final String SSO_HOST = "https://sso.duibatest.com.cn";
public static final String MANAGER_HOST = "https://kjj-mng.duibatest.com.cn";
public static final String MOBILE_HOST = "https://live.duibatest.com.cn";
public static final String WORK_HOST = "https://kjj-work.duibatest.com.cn";
public static final String FORM_HOST = "https://kjj-static.duibatest.com.cn";
public static final String PHONE_HOST = "https://kjj-auth.duibatest.com.cn";
public static final String JiuJiuBao_HOST = "https://oto-mng.duibatest.com.cn";
// *************** 管理后台 ***************
public static final String SSO_doLogin = SSO_HOST + "/doLogin";
public static final String MANAGER_adminInfo= MANAGER_HOST + "/kjy/manager/admin/info";
public static final String MANAGER_ID_ENCODE = MANAGER_HOST + "/kjy/manager/testUser/encode";
public static final String MANAGER_ID_DECODE = MANAGER_HOST + "/kjy/manager/testUser/decode";
//*************** 自动化用户 ***************
public static final String TEST_testerSave = MOBILE_HOST + "/test/user/test/save";
public static final String TEST_testerDelete = MOBILE_HOST + "/test/user/test/delete";
public static final String MANAGER_encryptAuthKey = MANAGER_HOST + "/kjy/manager/testUser/encryptAuthKey";
//*************** OTO销售工作台 ***************
public static final String MANAGER_oto_saveTag = MANAGER_HOST + "/kjy/manager/oto/tag/save";
public static final String MANAGER_oto_updateTag = MANAGER_HOST + "/kjy/manager/oto/tag/update";
public static final String MANAGER_oto_deleteTag = MANAGER_HOST +"/kjy/manager/oto/tag/delete";
public static final String MANAGER_oto_tagList = MANAGER_HOST + "/kjy/manager/oto/tag/list";
public static final String MANAGER_oto_switchStatus = MANAGER_HOST + "/kjy/manager/oto/tag/switchStatus";
public static final String MANAGER_oto_sellerList = MANAGER_HOST + "/kjy/manager/oto/seller/list";
public static final String MANAGER_oto_saveSeller = MANAGER_HOST + "/kjy/manager/oto/seller/save";
public static final String MANAGER_oto_updateSeller = MANAGER_HOST + "/kjy/manager/oto/seller/update";
public static final String MANAGER_oto_directorList = MANAGER_HOST + "/kjy/manager/oto/seller/directorList";
public static final String MANAGER_oto_updateCompany = MANAGER_HOST + "/kjy/manager/oto/company/update";
public static final String MANAGER_oto_saveCompany = MANAGER_HOST + "/kjy/manager/oto/company/save";
public static final String MANAGER_oto_listCompany = MANAGER_HOST + "/kjy/manager/oto/company/list";
public static final String MANAGER_oto_listAllCompany = MANAGER_HOST + "/kjy/manager/oto/company/listAll";
public static final String MANAGER_oto_switchWorkStatus = MANAGER_HOST + "/kjy/manager/oto/seller/switchWorkStatus";
public static final String MANAGER_oto_customerList = MANAGER_HOST +"/kjy/manager/pub/form/customer/list/v2";
public static final String MANAGER_oto_assignSeller = MANAGER_HOST +"/kjy/manager/pub/form/customer/assignSeller";
public static final String MANAGER_oto_switchSellerStatus = MANAGER_HOST +"/kjy/manager/oto/seller/switchSellerStatus";
public static final String MANAGER_oto_switchCallPermissio = MANAGER_HOST +"/kjy/manager/oto/seller/switchCallPermission";
public static final String MANAGER_oto_searchSeller = MANAGER_HOST +"/kjy/manager/pub/form/customer/searchSeller";
public static final String MANAGER_oto_customerPhone = MANAGER_HOST +"/kjy/manager/pub/form/customer/customerPhone";
public static final String MANAGER_oto_qaDetail = MANAGER_HOST +"/kjy/manager/pub/form/customer/qaDetail";
public static final String MANAGER_oto_channelList = MANAGER_HOST +"/kjy/manager/pub/form/channelList";
public static final String MANAGER_oto_updatePermission = MANAGER_HOST +"/kjy/manager/oto/seller/updatePermission";
public static final String MANAGER_oto_switchDimissionStatus = MANAGER_HOST +"/kjy/manager/oto/seller/switchDimissionStatus";
public static final String MANAGER_oto_productList = MANAGER_HOST +"/kjy/manager/oto/product/list";
public static final String MANAGER_oto_productSave = MANAGER_HOST +"/kjy/manager/oto/product/save";
public static final String MANAGER_oto_productUpdateStatus = MANAGER_HOST +"/kjy/manager/oto/product/updateStatus";
public static final String MANAGER_oto_accountList = MANAGER_HOST + "/kjy/manager/oto/seller/account/availableList";
public static final String MANAGER_oto_accountBind = MANAGER_HOST + "/kjy/manager/oto/seller/account/bind";
public static final String MANAGER_oto_accountUnbind = MANAGER_HOST + "/kjy/manager/oto/seller/account/unbind";
public static final String MANAGER_oto_change = MANAGER_HOST + "/kjy/manager/oto/seller/phone/change";
public static final String WORK_getCaptcha = WORK_HOST + "/kjy/oto/manager/auth/captcha";
public static final String WORK_login = WORK_HOST + "/kjy/oto/manager/auth/login";
public static final String WORK_userInfo = WORK_HOST + "/kjy/oto/manager/auth/userInfo";
public static final String FORM_submit = FORM_HOST + "/kjy/live/pub/form/user/submit";
public static final String FORM_submitQuestion = FORM_HOST + "/kjy/live/pub/form/question/submit";
public static final String WORK_staticHeader = WORK_HOST + "/kjy/oto/manager/customer/statistic/header";
public static final String WORK_staticChart = WORK_HOST + "/kjy/oto/manager/customer/statistic/custFlowChart";
public static final String WORK_notifyList = WORK_HOST + "/kjy/oto/manager/customer/notify/list";
public static final String WORK_tagList = WORK_HOST + "/kjy/oto/manager/tag/list";
public static final String WORK_customerList = WORK_HOST + "/kjy/oto/manager/customer/list";
public static final String WORK_phone = WORK_HOST + "/kjy/oto/manager/customer/phoneNum";
public static final String WORK_info = WORK_HOST + "/kjy/oto/manager/customer/visit/info";
public static final String WORK_header = WORK_HOST + "/kjy/oto/manager/customer/header";
public static final String WORK_detail = WORK_HOST + "/kjy/oto/manager/customer/detail";
public static final String WORK_showFeedback = WORK_HOST + "/kjy/oto/manager/customer/call/showFeedback";
public static final String WORK_regionCity = WORK_HOST + "/kjy/oto/manager/customer/regionCity";
public static final String WORK_callLog = WORK_HOST + "/kjy/oto/manager/customer/log/call";
public static final String WORK_meet = WORK_HOST + "/kjy/oto/manager/customer/meet";
public static final String WORK_star = WORK_HOST + "/kjy/oto/manager/customer/star";
public static final String WORK_assess = WORK_HOST + "/kjy/oto/manager/customer/assess";
public static final String WORK_weight = WORK_HOST + "/kjy/oto/manager/customer/follow/weight";
public static final String WORK_tag = WORK_HOST + "/kjy/oto/manager/customer/tag";
public static final String WORK_order = WORK_HOST + "/kjy/oto/manager/customer/order";
public static final String WORK_feedback = WORK_HOST + "/kjy/oto/manager/customer/feedback";
public static final String WORK_edit = WORK_HOST + "/kjy/oto/manager/customer/edit";
public static final String WORK_operation = WORK_HOST + "/kjy/oto/manager/customer/log/operation";
public static final String WORK_fuzzyCustName= WORK_HOST + "/kjy/oto/manager/customer/fuzzy/custName";
public static final String WORK_call= WORK_HOST + "/kjy/oto/manager/customer/call";
public static final String WORK_logout= WORK_HOST + "/kjy/oto/manager/auth/logout";
public static final String WORK_leadsConfig= WORK_HOST + "/kjy/oto/manager/customer/pool/leadsConfig";
public static final String WORK_freshList= WORK_HOST + "/kjy/oto/manager/customer/pool/fresh/list";
public static final String WORK_recycleList= WORK_HOST + "/kjy/oto/manager/customer/pool/recycle/list";
public static final String WORK_claim= WORK_HOST + "/kjy/oto/manager/customer/pool/claim";
public static final String WORK_attendanceList= WORK_HOST + "/kjy/oto/manager/attendance/list";
public static final String WORK_switchWorkStatus= WORK_HOST + "/kjy/oto/manager/attendance/switchWorkStatus";
public static final String WORK_saveOrModifySchedule= WORK_HOST + "/kjy/oto/manager/sellerNotify/saveOrModifySchedule";
public static final String WORK_cancelSchedule= WORK_HOST + "/kjy/oto/manager/sellerNotify/cancelSchedule";
public static final String WORK_abandonCust= WORK_HOST + "/kjy/oto/manager/customer/abandonCust";
public static final String WORK_interviewAuditList= WORK_HOST + "/kjy/oto/manager/audit/getInterviewAuditList";
public static final String WORK_interviewAuditReject= WORK_HOST + "/kjy/oto/manager/audit/interviewAuditReject";
public static final String WORK_interviewAuditPass= WORK_HOST + "/kjy/oto/manager/audit/interviewAuditPass";
public static final String WORK_taskConfList= WORK_HOST + "/kjy/oto/manager/sellerTask/taskConfList";
public static final String WORK_modifyTaskConf= WORK_HOST + "/kjy/oto/manager/sellerTask/modifyTaskConf";
public static final String WORK_statisticHeader= WORK_HOST + "/kjy/oto/manager/sellerTask/statistic/header";
public static final String WORK_taskDetailsList= WORK_HOST + "/kjy/oto/manager/sellerTask/taskDetailsList";
public static final String PHONE_customerList = PHONE_HOST + "/kjy/oto/manager/customer/list";
public static final String PHONE_customerSave = PHONE_HOST + "/kjy/oto/manager/customer/introduce/save";
public static final String PHONE_appointmentDetail = PHONE_HOST + "/kjy/oto/interview/appointment/detail";
public static final String PHONE_fuzzyList = PHONE_HOST + "/kjy/oto/cust/fuzzy/list";
public static final String PHONE_interviewSave = PHONE_HOST + "/kjy/oto/interview/save";
public static final String PHONE_interviewUpdate = PHONE_HOST + "/kjy/oto/interview/appointment/update";
public static final String PHONE_interviewList = PHONE_HOST + "/kjy/oto/interview/list";
public static final String PHONE_interviewCancel = PHONE_HOST + "/kjy/oto/interview/cancel";
public static final String PHONE_interviewCode = PHONE_HOST + "/kjy/oto/h5/interview/code";
public static final String PHONE_interviewStatus = PHONE_HOST + "/kjy/oto/h5/v1/getInterviewStatus";
public static final String PHONE_interviewPhone = PHONE_HOST + "/kjy/oto/h5/interview/phone";
public static final String PHONE_interviewBind = PHONE_HOST + "/kjy/oto/h5/interview/bind";
public static final String PHONE_bindCancel = PHONE_HOST + "/kjy/oto/h5/interview/cancel";
public static final String PHONE_feedbackDetail = PHONE_HOST + "/kjy/oto/interview/feedback/detail";
public static final String PHONE_custExtDetail = PHONE_HOST + "/kjy/oto/interview/custExtDetail";
public static final String PHONE_interviewFeedback = PHONE_HOST + "/kjy/oto/interview/feedback";
public static final String PHONE_interviewDetail = PHONE_HOST + "/kjy/oto/interview/edit/detail";
public static final String PHONE_bindWxUser = HOST + "/kjy/oto/interview/bindWxUser";
public static final String PHONE_submitEvaluate = HOST + "/kjy/oto/interview/submitEvaluate";
public static final String PHONE_listBysellComp = PHONE_HOST + "/kjy/oto/manager/customer/listBysellComp";
public static final String PHONE_address = PHONE_HOST + "/kjy/oto/h5/v1/save/address";
public static final String PHONE_getUnusualTypes = PHONE_HOST + "/kjy/oto/h5/v1/getUnusualTypes";
public static final String PHONE_fail = HOST + "/kjy/oto/interview/authorize/fail";
public static final String PHONE_getReservationList = HOST + "/kjy/pub/form/getReservationList";
public static final String WORK_verifyCode = WORK_HOST + "/kjy/oto/auto/test/verifyCode";
public static final String WORK_delCust = WORK_HOST + "/kjy/oto/auto/test/delCust";
public static final String WORK_delPubFormRecord = WORK_HOST + "/kjy/oto/auto/test/delPubFormRecord";
//*************** 人管系统 ***************
public static final String JiuJiuBao_login = JiuJiuBao_HOST + "/oto/manager/login";
public static final String JiuJiuBao_auditSave = JiuJiuBao_HOST + "/oto/manager/audit/save";
public static final String JiuJiuBao_auditSubmitDetail = JiuJiuBao_HOST + "/oto/manager/audit/submit/detail";
public static final String JiuJiuBao_auditSubmit = JiuJiuBao_HOST + "/oto/manager/audit/submit";
public static final String JiuJiuBao_auditList = JiuJiuBao_HOST + "/oto/manager/audit/list";
public static final String JiuJiuBao_auditIsApprove = JiuJiuBao_HOST + "/oto/manager/audit/isApprove";
public static final String JiuJiuBao_sellerList = JiuJiuBao_HOST + "/oto/manager/seller/list";
public static final String JiuJiuBao_sellerUpdate = JiuJiuBao_HOST + "/oto/manager/seller/update";
public static final String JiuJiuBao_phoneChange = JiuJiuBao_HOST + "/oto/manager/seller/phone/change";
public static final String JiuJiuBao_updatePermission = JiuJiuBao_HOST + "/oto/manager/seller/updatePermission";
public static final String JiuJiuBao_accountBind = JiuJiuBao_HOST + "/oto/manager/jjb/seller/account/bind";
public static final String JiuJiuBao_accountUnbind = JiuJiuBao_HOST + "/oto/manager/seller/account/unbind";
public static final String JiuJiuBao_availableList = JiuJiuBao_HOST + "/oto/manager/jjb/seller/account/availableList";
public static final String JiuJiuBao_auditLeave = JiuJiuBao_HOST + "/oto/manager/audit/leave";
public static final String JiuJiuBao_aloginOut = JiuJiuBao_HOST + "/oto/manager/login/out";
}
package com.oto.config;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.ResourceCDN;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.model.TestAttribute;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.ChartLocation;
import org.testng.*;
import org.testng.xml.XmlSuite;
import java.io.File;
import java.util.*;
import com.oto.utils.DingTalkUtils;
public class ExtentTestNGIReporterListener implements IReporter {
// 生成的路径以及文件名
private static final String OUTPUT_FOLDER = "test-output/";
//注意这里如果用index.html可能会导致testng的report会覆盖它
private static final String FILE_NAME = "report.html";
private ExtentReports extent;
@Override
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
init();
boolean createSuiteNode = false;
//判断执行用例的队列是否有多个
if (suites.size() == 0) {
createSuiteNode = true;
}
StringBuffer contextString = new StringBuffer();
for (ISuite suite : suites) {
Map<String, ISuiteResult> result = suite.getResults();
// 如果suite里面没有任何用例,直接跳过,不在报告里生成
if (result.size() == 0) {
continue;
}
// 统计suite下的成功、失败的总用例数
int suiteFailSize = 0;
int suitePassSize = 0;
ExtentTest suiteTest = null;
// 存在多个suite的情况下,在报告中将同一个suite的测试结果归为一类,创建一级节点。
if (createSuiteNode) {
suiteTest = extent.createTest(suite.getName()).assignCategory(suite.getName());
}
boolean createSuiteResultNode = false;
if (result.size() >= 1) {
createSuiteResultNode = true;
}
for (ISuiteResult r : result.values()) {
ExtentTest resultNode;
ITestContext context = r.getTestContext();
if (createSuiteResultNode) {
// 没有创建suite的情况下,将在SuiteResult的创建为一级节点,否则创建为suite的一个子节点。
if (null == suiteTest) {
resultNode = extent.createTest(r.getTestContext().getName());
} else {
resultNode = suiteTest.createNode(r.getTestContext().getName());
}
} else {
resultNode = suiteTest;
}
if (resultNode != null) {
resultNode.getModel().setName(suite.getName() + " : " + r.getTestContext().getName());
if (resultNode.getModel().hasCategory()) {
resultNode.assignCategory(r.getTestContext().getName());
} else {
resultNode.assignCategory(suite.getName(), r.getTestContext().getName());
}
resultNode.getModel().setStartTime(r.getTestContext().getStartDate());
resultNode.getModel().setEndTime(r.getTestContext().getEndDate());
// 统计SuiteResult下的数据
int passSize = r.getTestContext().getPassedTests().size();
int failSize = r.getTestContext().getFailedTests().size();
suitePassSize += passSize;
suiteFailSize += failSize;
if (failSize > 0) {
resultNode.getModel().setStatus(Status.FAIL);
}
resultNode.getModel().setDescription(
String.format("Pass: %s ; Fail: %s ;", passSize, failSize));
}
buildTestNodes(resultNode, context.getFailedTests(), Status.FAIL);
// buildTestNodes(resultNode, context.getSkippedTests(), Status.SKIP);
buildTestNodes(resultNode, context.getPassedTests(), Status.PASS);
}
if (suiteTest != null) {
suiteTest.getModel().setDescription(
String.format("Pass: %s ; Fail: %s ;", suitePassSize, suiteFailSize));
if (suiteFailSize > 0) {
suiteTest.getModel().setStatus(Status.FAIL);
}
}
contextString.append(suite.getName()).append("\n")
.append(String.format("总用例数: %s\n通过的用例数: %s\n失败的用例数: %s\n", suite.getAllMethods().size(), suitePassSize, suiteFailSize))
.append("\n");
}
try {
DingTalkUtils.sendVal(contextString.toString());
} catch (Exception e) {
e.printStackTrace();
}
extent.flush();
}
private void init() {
// 文件夹不存在的话进行创建
File reportDir = new File(OUTPUT_FOLDER);
if (!reportDir.exists() && !reportDir.isDirectory()) {
reportDir.mkdir();
}
ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME);
// 设置静态文件的DNS
//怎么样解决cdn.rawgit.com访问不了的情况
htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);
htmlReporter.config().setDocumentTitle("客集集-自动化测试报告");
htmlReporter.config().setReportName("客集集-自动化测试报告");
htmlReporter.config().setChartVisibilityOnOpen(true);
//报表位置
htmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);
htmlReporter.config().setCSS(".node.level-1 ul{ display:none;} .node.level-1.active ul{display:block;}");
extent = new ExtentReports();
extent.attachReporter(htmlReporter);
extent.setReportUsesManualConfiguration(true);
}
private void buildTestNodes(ExtentTest extenttest, IResultMap tests, Status status) {
// 存在父节点时,获取父节点的标签
String[] categories = new String[0];
if (extenttest != null) {
List<TestAttribute> categoryList = extenttest.getModel().getCategoryContext().getAll();
categories = new String[categoryList.size()];
for (int index = 0; index < categoryList.size(); index++) {
categories[index] = categoryList.get(index).getName();
}
}
ExtentTest test;
if (tests.size() > 0) {
// 调整用例排序,按时间排序
Set<ITestResult> treeSet = new TreeSet<ITestResult>(new Comparator<ITestResult>() {
@Override
public int compare(ITestResult o1, ITestResult o2) {
return o1.getStartMillis() < o2.getStartMillis() ? -1 : 1;
}
});
treeSet.addAll(tests.getAllResults());
for (ITestResult result : treeSet) {
Object[] parameters = result.getParameters();
String name = "";
// 如果有参数,则使用参数的toString组合代替报告中的name
for (Object param : parameters) {
name += param.toString();
}
if (name.length() > 0) {
if (name.length() > 50) {
name = name.substring(0, 49) + "...";
}
} else {
name = result.getMethod().getMethodName();
}
if (extenttest == null) {
test = extent.createTest(name);
} else {
// 作为子节点进行创建时,设置同父节点的标签一致,便于报告检索。
test = extenttest.createNode(name).assignCategory(categories);
}
for (String group : result.getMethod().getGroups())
test.assignCategory(group);
List<String> outputList = Reporter.getOutput(result);
for (String output : outputList) {
// 将用例的log输出报告中
test.debug(output);
}
if (result.getThrowable() != null) {
test.log(status, result.getThrowable());
} else {
test.log(status, "Test " + status.toString().toLowerCase() + "ed");
}
test.getModel().setStartTime(getTime(result.getStartMillis()));
test.getModel().setEndTime(getTime(result.getEndMillis()));
}
}
}
private Date getTime(long millis) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millis);
return calendar.getTime();
}
}
package com.oto.sql;
import java.sql.*;
import java.util.*;
public class KjyLiveNormalDB {
private static KjyLiveNormalDB user_Utils;
//数据库用户名
private String USERNAME = "auto_test";
//数据库密码
private String PASSWORD = "881QYHoGGgc09Ngv"; //= "yanzi";
//驱动信息
private String DRIVER="com.mysql.cj.jdbc.Driver";
//数据库地址
private String USER_URL="jdbc:mysql://rm-bp11mkg584kvjr485.mysql.rds.aliyuncs.com:3306/kjy_live_normal";
private Connection connection;
private PreparedStatement pstmt;
private ResultSet resultSet;
public static synchronized KjyLiveNormalDB getInstance(){
if (Objects.nonNull(user_Utils)){
return user_Utils;
}
user_Utils = new KjyLiveNormalDB();
user_Utils.initConnection();
return user_Utils;
}
/**
* 获得数据库的连接
* @return
*/
private Connection initConnection(){
try {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String url = USER_URL+"?autoReconnect=true&testOnBorrow=true&testWhileIdle=true";
connection = DriverManager.getConnection(url,USERNAME,PASSWORD);
System.out.println("数据库连接成功!");
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
/**
* 查询结果只有一行数据
* @param sql sql语句
* @param params 可变参数,替换 ?
* @return map
* @throws SQLException
*/
public Map<String, Object> findSimpleResult(String sql, Object ...params) throws SQLException{
if(!connection.isValid(3)){
System.out.println("mysql connect is not vaild,reconnect.");
connection.close();
initConnection();
}
Map<String, Object> map = new HashMap<String, Object>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !(params.length==0)){
for(int i=0; i<params.length; i++){
pstmt.setObject(index++, params[i]);
}
}
System.out.println("sql:"+pstmt.toString());
resultSet = pstmt.executeQuery();//返回查询结果
ResultSetMetaData metaData = resultSet.getMetaData();
int col_len = metaData.getColumnCount();
while(resultSet.next()){
for(int i=0; i<col_len; i++ ){
String cols_name = metaData.getColumnName(i+1);
Object cols_value = resultSet.getObject(cols_name);
if(cols_value == null){
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
return map;
}
/**
* 返回多条数据
* @param sql sql语句
* @param params 可变参数,替换 ?
* @return list
* @throws SQLException
*/
public List<Map<String, Object>> findModeResult(String sql, Object ...params) throws SQLException{
if(!connection.isValid(3)){
System.out.println("mysql connect is not vaild,reconnect.");
connection.close();
initConnection();
}
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !(params.length==0)){
for(int i=0; i<params.length; i++){
pstmt.setObject(index++, params[i]);
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while(resultSet.next()){
Map<String, Object> map = new HashMap<String, Object>();
for(int i=0; i<cols_len; i++){
String cols_name = metaData.getColumnName(i+1);
Object cols_value = resultSet.getObject(cols_name);
if(cols_value == null){
cols_value = "";
}
map.put(cols_name, cols_value);
}
list.add(map);
}
return list;
}
/**
* 执行更新语句
* @param sql sql语句
* @param params 可变参数,替换 ?
* @return void
* @throws SQLException
*/
public void updataSql(String sql, Object ...params) throws SQLException{
if(!connection.isValid(3)){
System.out.println("mysql connect is not vaild,reconnect.");
connection.close();
initConnection();
}
Map<String, Object> map = new HashMap<String, Object>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !(params.length==0)){
for(int i=0; i<params.length; i++){
pstmt.setObject(index++, params[i]);
}
}
System.out.println("sql:"+pstmt.toString());
pstmt.executeUpdate();//返回更新结果
}
/**
* 释放数据库连接
*/
public void releaseConn(){
if(resultSet != null){
try{
resultSet.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
package com.oto.sql;
import java.sql.*;
import java.util.*;
public class KjyUserDB {
private static KjyUserDB user_Utils;
//数据库用户名
private String USERNAME = "auto_test";
//数据库密码
private String PASSWORD = "881QYHoGGgc09Ngv"; //= "yanzi";
//驱动信息
private String DRIVER="com.mysql.cj.jdbc.Driver";
//数据库地址
private String USER_URL="jdbc:mysql://rm-bp11mkg584kvjr485.mysql.rds.aliyuncs.com:3306/kjy_user";
private Connection connection;
private PreparedStatement pstmt;
private ResultSet resultSet;
public static synchronized KjyUserDB getInstance(){
if (Objects.nonNull(user_Utils)){
return user_Utils;
}
user_Utils = new KjyUserDB();
user_Utils.initConnection();
return user_Utils;
}
/**
* 获得数据库的连接
* @return
*/
private Connection initConnection(){
try {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String url = USER_URL+"?autoReconnect=true&testOnBorrow=true&testWhileIdle=true";
connection = DriverManager.getConnection(url,USERNAME,PASSWORD);
System.out.println("数据库连接成功!");
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
/**
* 查询结果只有一行数据
* @param sql sql语句
* @param params 可变参数,替换 ?
* @return map
* @throws SQLException
*/
public Map<String, Object> findSimpleResult(String sql, Object ...params) throws SQLException{
if(!connection.isValid(3)){
System.out.println("mysql connect is not vaild,reconnect.");
connection.close();
initConnection();
}
Map<String, Object> map = new HashMap<String, Object>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !(params.length==0)){
for(int i=0; i<params.length; i++){
pstmt.setObject(index++, params[i]);
}
}
System.out.println("sql:"+pstmt.toString());
resultSet = pstmt.executeQuery();//返回查询结果
ResultSetMetaData metaData = resultSet.getMetaData();
int col_len = metaData.getColumnCount();
while(resultSet.next()){
for(int i=0; i<col_len; i++ ){
String cols_name = metaData.getColumnName(i+1);
Object cols_value = resultSet.getObject(cols_name);
if(cols_value == null){
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
return map;
}
/**
* 返回多条数据
* @param sql sql语句
* @param params 可变参数,替换 ?
* @return list
* @throws SQLException
*/
public List<Map<String, Object>> findModeResult(String sql, Object ...params) throws SQLException{
if(!connection.isValid(3)){
System.out.println("mysql connect is not vaild,reconnect.");
connection.close();
initConnection();
}
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !(params.length==0)){
for(int i=0; i<params.length; i++){
pstmt.setObject(index++, params[i]);
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while(resultSet.next()){
Map<String, Object> map = new HashMap<String, Object>();
for(int i=0; i<cols_len; i++){
String cols_name = metaData.getColumnName(i+1);
Object cols_value = resultSet.getObject(cols_name);
if(cols_value == null){
cols_value = "";
}
map.put(cols_name, cols_value);
}
list.add(map);
}
return list;
}
/**
* 执行更新语句
* @param sql sql语句
* @param params 可变参数,替换 ?
* @return void
* @throws SQLException
*/
public void updataSql(String sql, Object ...params) throws SQLException{
if(!connection.isValid(3)){
System.out.println("mysql connect is not vaild,reconnect.");
connection.close();
initConnection();
}
Map<String, Object> map = new HashMap<String, Object>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if(params != null && !(params.length==0)){
for(int i=0; i<params.length; i++){
pstmt.setObject(index++, params[i]);
}
}
System.out.println("sql:"+pstmt.toString());
pstmt.executeUpdate();//返回更新结果
}
/**
* 释放数据库连接
*/
public void releaseConn(){
if(resultSet != null){
try{
resultSet.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
package com.oto.sql;
public class UserSqlFactory {
private UserSqlFactory(){}
public static final String selectUserIdByUnionId = "select id from tb_users where union_id=?";
public static final String selectUserIdByOpenId = "SELECT user_id FROM `tb_users_wx_ext` WHERE `open_id` = ?";
public static final String selectUserIdForJmeter = "SELECT a.`id` FROM `tb_live_user` a, `tb_users` b ,`tb_users_wx_ext` c WHERE a.`biz_user_id` = b.`id` and b.`id` = c.`user_id` and b.`union_id` NOT LIKE \"-d%\" AND c.`open_id` IS NOT NULL and c.`oa_id` = 14";
public static final String selectCodeIdByCustomerId = "SELECT `scan_code_id` FROM `tb_cust_interview_record` WHERE `customer_id` = ? and interview_status = 1 ORDER BY id DESC ";
}
package com.oto.utils;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
/**
* Created with IntelliJ IDEA.
* User: noah
* Date: 8/2/13
* Time: 10:36 AM
* To change this template use File | Settings | File Templates.
*/
public class Base58 {
private static final char[] ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".toCharArray();
private static final int[] INDEXES = new int[128];
static {
for (int i = 0; i < INDEXES.length; i++) {
INDEXES[i] = -1;
}
for (int i = 0; i < ALPHABET.length; i++) {
INDEXES[ALPHABET[i]] = i;
}
}
/**
* Encodes the given bytes in base58. No checksum is appended.
*/
public static String encode(byte[] input) {
if (input.length == 0) {
return "";
}
input = copyOfRange(input, 0, input.length);
// Count leading zeroes.
int zeroCount = 0;
while (zeroCount < input.length && input[zeroCount] == 0) {
++zeroCount;
}
// The actual encoding.
byte[] temp = new byte[input.length * 2];
int j = temp.length;
int startAt = zeroCount;
while (startAt < input.length) {
byte mod = divmod58(input, startAt);
if (input[startAt] == 0) {
++startAt;
}
temp[--j] = (byte) ALPHABET[mod];
}
// Strip extra '1' if there are some after decoding.
while (j < temp.length && temp[j] == ALPHABET[0]) {
++j;
}
// Add as many leading '1' as there were leading zeros.
while (--zeroCount >= 0) {
temp[--j] = (byte) ALPHABET[0];
}
byte[] output = copyOfRange(temp, j, temp.length);
try {
return new String(output, "US-ASCII");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e); // Cannot happen.
}
}
public static byte[] decode(String input) throws IllegalArgumentException {
if (input.length() == 0) {
return new byte[0];
}
byte[] input58 = new byte[input.length()];
// Transform the String to a base58 byte sequence
for (int i = 0; i < input.length(); ++i) {
char c = input.charAt(i);
int digit58 = -1;
if (c >= 0 && c < 128) {
digit58 = INDEXES[c];
}
if (digit58 < 0) {
throw new IllegalArgumentException("Illegal character " + c + " at " + i);
}
input58[i] = (byte) digit58;
}
// Count leading zeroes
int zeroCount = 0;
while (zeroCount < input58.length && input58[zeroCount] == 0) {
++zeroCount;
}
// The encoding
byte[] temp = new byte[input.length()];
int j = temp.length;
int startAt = zeroCount;
while (startAt < input58.length) {
byte mod = divmod256(input58, startAt);
if (input58[startAt] == 0) {
++startAt;
}
temp[--j] = mod;
}
// Do no add extra leading zeroes, move j to first non null byte.
while (j < temp.length && temp[j] == 0) {
++j;
}
return copyOfRange(temp, j - zeroCount, temp.length);
}
public static BigInteger decodeToBigInteger(String input) throws IllegalArgumentException {
return new BigInteger(1, decode(input));
}
//
// number -> number / 58, returns number % 58
//
private static byte divmod58(byte[] number, int startAt) {
int remainder = 0;
for (int i = startAt; i < number.length; i++) {
int digit256 = (int) number[i] & 0xFF;
int temp = remainder * 256 + digit256;
number[i] = (byte) (temp / 58);
remainder = temp % 58;
}
return (byte) remainder;
}
//
// number -> number / 256, returns number % 256
//
private static byte divmod256(byte[] number58, int startAt) {
int remainder = 0;
for (int i = startAt; i < number58.length; i++) {
int digit58 = (int) number58[i] & 0xFF;
int temp = remainder * 58 + digit58;
number58[i] = (byte) (temp / 256);
remainder = temp % 256;
}
return (byte) remainder;
}
private static byte[] copyOfRange(byte[] source, int from, int to) {
byte[] range = new byte[to - from];
System.arraycopy(source, from, range, 0, range.length);
return range;
}
}
package com.oto.utils;
import com.oto.config.BasicConfig;
import io.restassured.response.Response;
import org.testng.Assert;
import java.util.*;
import static com.oto.config.BasicConfig.*;
public class BaseUtils {
private static final NetworkUtils network = NetworkUtils.getInstance();
public static String tku1;
public static String tku2;
public static String superCookieKey;
public static String superCookieValue;
public static String companyCookieKey;
public static String companyCookieValue;
public static String officeCookieKey;
public static String officeCookieValue;
public static String otoSellerCookieKey;
public static String otoSellerCookieValue;
public static String otoLeaderCookieKey;
public static String otoLeaderCookieValue;
public static String otoManagerCookieKey;
public static String otoManagerCookieValue;
public static String JJBManagerCookieKey;
public static String JJBManagerCookieValue;
/**
* 登录管理后台
*/
public static void ssoLogin(){
// 请求下后台的管理员信息接口
Response response = network.getResponse(MANAGER_adminInfo);
String actualType = "application/json;charset=UTF-8";
String exceptType = response.headers().getValue("Content-Type"); //如果返回的是html的contentType,说明token已经失效
// 判断请求接口后 后台的Csrf-Token是否失效,若两个值相等则有效,反之
if (actualType.equals(exceptType)){
return;
}
// 1.先进入SSO登录框 登入管理后台
Map<String, Object> loginParams = new HashMap<String, Object>();
loginParams.put("email","test@duiba.com.cn");
loginParams.put("password","d83HjbsJY76UJH");
loginParams.put("loginTimeout",1);
loginParams.put("redirect",MANAGER_HOST);
loginParams.put("systemId",201);
response = network.postResponse(loginParams,SSO_doLogin);
Map<String, String> ssoCookies = response.getCookies();
network.agentCookies.putAll(ssoCookies); //存入cookies
ssoCookies = response.getCookies();
network.agentCookies.putAll(ssoCookies);
network.agentHeaders.put("X-Csrf-Token",ssoCookies.get("csrf_token"));
// 免登
network.agentCookies.put("sso_ticket", "autotest");
}
/**
* 普通销售员登录销售工作台
*/
public static void otoSellerLogin(){
// ThreadSleepUtils.sleep(2000);
// // 调用登录接口
// Map<String, Object> params = new HashMap<String, Object>();
// params.put("phoneNumber","18248405155");
// Response response = network.getResponse(params,BasicConfig.WORK_getCaptcha);
// boolean data = response.jsonPath().getBoolean("data");
// Assert.assertTrue(data,network.message(params,BasicConfig.WORK_getCaptcha,"获取验证码失败",response.body().asString()));
//
// //专用于自动化获取验证码
// params.clear();
// params.put("phoneNumber","18248405155");
// Response autoTestRes = network.getResponse(params,BasicConfig.WORK_verifyCode);
// String captcha = autoTestRes.jsonPath().getString("data");
// System.out.println(captcha);
//
// //登录接口
// ThreadSleepUtils.sleep(2000);
// params.clear();
// params.put("phoneNumber","18248405155");
// params.put("captcha",captcha);
// Response loginRes = network.postResponse(params,BasicConfig.WORK_login);
// boolean success = loginRes.jsonPath().getBoolean("success");
// Assert.assertTrue(success, network.message(params,BasicConfig.WORK_login,"登录失败",loginRes.body().asString()));
//
// //获取cookie
// String header = loginRes.getHeader("Set-Cookie");
// String cookieStr = header.split(";")[0];
// String[] cookieKeyValue = cookieStr.split("=");
// otoSellerCookieKey = cookieKeyValue[0];
// otoSellerCookieValue = cookieKeyValue[1];
otoSellerCookieKey = "otoToken";
otoSellerCookieValue = "64e83LYGbaXYX9EkHumCho2UoHa4LLngpoj9ksrdj5vUiAndSwpeHVxc45qhsXT8a8niiL6oifhdXYR2BvYntaAoj4zRqmExv6eEuMsTfiN";
network.agentCookies.put(otoSellerCookieKey, otoSellerCookieValue); //存入cookies
System.out.println("销售Cookie中key:"+ otoSellerCookieKey +" ,values:"+ otoSellerCookieValue);
}
/**
* 总监登录销售工作台
*/
public static void otoLeaderLogin(){
// ThreadSleepUtils.sleep(2000);
// // 调用登录接口
// Map<String, Object> params = new HashMap<String, Object>();
// params.put("phoneNumber","13454131091");
// Response response = network.getResponse(params,BasicConfig.WORK_getCaptcha);
// boolean data = response.jsonPath().getBoolean("data");
// Assert.assertTrue(data,network.message(params,BasicConfig.WORK_getCaptcha,"获取验证码失败",response.body().asString()));
//
// //专用于自动化获取验证码
// params.clear();
// params.put("phoneNumber","13454131091");
// Response autoTestRes = network.getResponse(params,BasicConfig.WORK_verifyCode);
// String captcha = autoTestRes.jsonPath().getString("data");
// System.out.println(captcha);
//
// //登录接口
// ThreadSleepUtils.sleep(2000);
// params.clear();
// params.put("phoneNumber","13454131091");
// params.put("captcha",captcha);
// Response loginRes = network.postResponse(params,BasicConfig.WORK_login);
// boolean success = loginRes.jsonPath().getBoolean("success");
// Assert.assertTrue(success, network.message(params,BasicConfig.WORK_login,"登录失败",loginRes.body().asString()));
//
// //获取cookie
// String header = loginRes.getHeader("Set-Cookie");
// String cookieStr = header.split(";")[0];
// String[] cookieKeyValue = cookieStr.split("=");
// otoLeaderCookieKey = cookieKeyValue[0];
// otoLeaderCookieValue = cookieKeyValue[1];
otoLeaderCookieKey = "otoToken";
otoLeaderCookieValue = "64e83LYGbaXYX9EkHumCho2UoHa4LLngtEH3qdP4vZcgziRKzqpEScM6Ea5UdYNEMDstTteXF6yrygqLEsBVdZJ1mKGyZ4cD5dZVM2RqyrK";
network.agentCookies.put(otoLeaderCookieKey, otoLeaderCookieValue); //存入cookies
System.out.println("总监Cookie中key:"+ otoLeaderCookieKey +" ,values:"+ otoLeaderCookieValue);
}
/**
* 管理员登录销售工作台
*/
public static void otoManagerLogin(){
// ThreadSleepUtils.sleep(2000);
// // 调用登录接口
// Map<String, Object> params = new HashMap<String, Object>();
// params.put("phoneNumber","13900651198");
// Response response = network.getResponse(params,BasicConfig.WORK_getCaptcha);
// boolean data = response.jsonPath().getBoolean("data");
// Assert.assertTrue(data,network.message(params,BasicConfig.WORK_getCaptcha,"获取验证码失败",response.body().asString()));
//
// //专用于自动化获取验证码
// params.clear();
// params.put("phoneNumber","15673990207");
// Response autoTestRes = network.getResponse(params,BasicConfig.WORK_verifyCode);
// String captcha = autoTestRes.jsonPath().getString("data");
// System.out.println(captcha);
//
// //登录接口
// ThreadSleepUtils.sleep(2000);
// params.clear();
// params.put("phoneNumber","15673990207");
// params.put("captcha",captcha);
// Response loginRes = network.postResponse(params,BasicConfig.WORK_login);
// boolean success = loginRes.jsonPath().getBoolean("success");
// Assert.assertTrue(success, network.message(params,BasicConfig.WORK_login,"登录失败",loginRes.body().asString()));
//
// //获取cookie
// String header = loginRes.getHeader("Set-Cookie");
// String cookieStr = header.split(";")[0];
// String[] cookieKeyValue = cookieStr.split("=");
// otoManagerCookieKey = cookieKeyValue[0];
// otoManagerCookieValue = cookieKeyValue[1];
otoManagerCookieKey = "otoToken";
otoManagerCookieValue = "2hdZyc3Wrhbokz5QFVTnXxxteUrg4U3szFLLQhKruh4Q6eZAVEBcYAKcwDfN5vGk9MNkshTkxpyidEtujMzGw5X5EsNfV1h7kn2bzap2P8baGi";
// network.agentCookies.put(otoManagerCookieKey, otoManagerCookieValue); //存入cookies
// System.out.println("销售Cookie中key:"+ otoManagerCookieKey +" ,values:"+ otoManagerCookieValue);
}
/**
* 登录久久保系统(目前账号及登录密码是写死的)
*/
public static void JJBLogin(){
Map<String,Object> params = new HashMap<>();
params.put("userName","adminzc");
params.put("userPwd","oto88888888");
Response response = network.postResponse(params,JiuJiuBao_login);
boolean data = response.jsonPath().getBoolean("data");
Assert.assertTrue(data, network.message(params, BasicConfig.JiuJiuBao_login,"久久保登录失败",response.body().asString()));
//获取cookie
String header = response.getHeader("Set-Cookie");
String cookieStr = header.split(";")[0];
String[] cookieKeyValue = cookieStr.split("=");
JJBManagerCookieKey = cookieKeyValue[0];
JJBManagerCookieValue = cookieKeyValue[1];
network.agentCookies.put(JJBManagerCookieKey,JJBManagerCookieValue);
System.out.println("久久保cookie中的key:"+JJBManagerCookieKey +",values:"+JJBManagerCookieValue);
}
}
package com.oto.utils;
import java.util.HashMap;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
/**
* Blowfish加密解密的方
*
* @link http://www.schneier.com/blowfish.html
*/
public class BlowfishUtils {
private static final String CIPHER_NAME="Blowfish/CFB8/NoPadding";
private static final String KEY_SPEC_NAME="Blowfish";
private static final ThreadLocal<HashMap<String, BlowfishUtils>> pool=new ThreadLocal<HashMap<String,BlowfishUtils>>();
private Cipher enCipher;
private Cipher deCipher;
private String key;
private BlowfishUtils(String key){
try {
this.key=key;
String iv= StringUtils.substring(DigestUtils.md5Hex(key), 0,8);
SecretKeySpec secretKeySpec=new SecretKeySpec(key.getBytes(), KEY_SPEC_NAME);
IvParameterSpec ivParameterSpec=new IvParameterSpec(iv.getBytes());
enCipher=Cipher.getInstance(CIPHER_NAME);
deCipher=Cipher.getInstance(CIPHER_NAME);
enCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec,ivParameterSpec);
deCipher.init(Cipher.DECRYPT_MODE, secretKeySpec,ivParameterSpec);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String encryptBlowfish(String s,String key){
return getInstance(key).encrypt(s);
}
public static String decryptBlowfish(String s,String key){
return getInstance(key).decrypt(s);
}
public static String encryptBlowfish(String s){
return encryptBlowfish(s, "abc");
}
public static String decryptBlowfish(String s){
return decryptBlowfish(s, "abc");
}
private static BlowfishUtils getInstance(String key){
HashMap<String, BlowfishUtils> keyMap=pool.get();
if(keyMap==null || keyMap.isEmpty()){
keyMap=new HashMap<String, BlowfishUtils>();
pool.set(keyMap);
}
BlowfishUtils instance=keyMap.get(key);
if(instance==null || !StringUtils.equals(instance.key, key)){
instance=new BlowfishUtils(key);
keyMap.put(key, instance);
}
return instance;
}
/**
* 加密
* @param s
* @return
*/
private String encrypt(String s){
String result=null;
if(StringUtils.isNotBlank(s)){
try {
byte[] encrypted=enCipher.doFinal(s.getBytes());
result=new String(Base58.encode(encrypted));
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
/**
* 解密
* @param s
* @return
*/
private String decrypt(String s){
String result=null;
if(StringUtils.isNotBlank(s)){
try {
byte[] decrypted=Base58.decode(s);
result=new String(deCipher.doFinal(decrypted));
} catch (Exception e) {
resetInstance();
e.printStackTrace();
}
}
return result;
}
private void resetInstance(){
pool.set(null);
}
}
package com.oto.utils;
import io.restassured.response.Response;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import static com.oto.config.BasicConfig.isPushReport;
public class DingTalkUtils {
private static final NetworkUtils network = NetworkUtils.getInstance();
private static final AtomicBoolean hasSend = new AtomicBoolean(true);
// 通过钉钉机器人发送消息到钉钉群中
public static void sendVal(String context)throws Exception{
if (!hasSend.compareAndSet(true, false)){
return;
}
//测试结果
context = "【接口自动化测试结果反馈】\n"
+ context
+ "报告地址: http://10.172.58.199/view/kkk/job/kejiji_interface/HTML_20Report\n";
System.out.println(context);
Map<String, Object> contentParams = new HashMap<String, Object>();
contentParams.put("content",context);
Map<String, Object> atParams = new HashMap<String, Object>();
atParams.put("atMobiles","17830855590");
//钉钉机器人消息体
Map<String, Object> params = new HashMap<String, Object>();
params.put("msgtype","text");
params.put("text",contentParams);
params.put("at", atParams);
//发起dingding机器人通知
if (isPushReport){
Response response = network.dingTalkRobot(params);
System.out.println("钉钉 response:"+response.asString());
}
}
// 流程走不通,发送错误信息到钉钉
public static void sendError(String errorMessage){
Map<String, Object> contentParams = new HashMap<String, Object>();
contentParams.put("content","【测试结果】\n" + errorMessage);
//钉钉机器人消息体
Map<String, Object> params = new HashMap<String, Object>();
params.put("msgtype","text");
params.put("text",contentParams);
System.out.println(params);
//发起dingding机器人通知
if (isPushReport){
Response response = network.dingTalkRobot(params);
response.body().prettyPrint();
}
}
public static void main(String[] args) {
}
}
package com.oto.utils;
import java.util.HashMap;
import java.util.Map;
/**
* @author lizhi
* @date 2020/4/9 11:36 AM
*/
public enum IdConvertBase64Enum {
/**
* 注意,code只能是两位
*/
DEF("j2", "默认类型"),
TRANS("t3", "短链接服务"),
;
private String code;
private String desc;
IdConvertBase64Enum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return "K"+ code;
}
private static final Map<String, IdConvertBase64Enum> ENUM_MAP = new HashMap<>();
static{
for(IdConvertBase64Enum lengthEnum : values()){
ENUM_MAP.put(lengthEnum.getCode(), lengthEnum);
}
}
public static IdConvertBase64Enum getByCode(String code) {
if (code == null) {
return null;
}
return ENUM_MAP.get(code);
}
}
\ No newline at end of file
package com.oto.utils;
import com.oto.cases.admin.Authorization;
import com.oto.config.BasicConfig;
import io.restassured.response.Response;
import org.apache.commons.lang.StringUtils;
import org.testng.Assert;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
/**
* Created by dugq on 2019-10-23.
*
* 把ID转换后通过base64编码得出来的值
* 规律: 以Kj2 开头。第四位为base64结尾'='的个数。避免url encoding
* 数字部分利用二进制左移3位,后三位补1 把数字变换掉,再base64转码。支持最大值为 2^(64-4)
* 兼容:旧版本以kjj开头 第四位取原数字第一位补充。 加密已删除,揭秘通过kjj 和 kj2 区分
* 修改原因: 旧版本太长, 且要处理URL编码问题导致多了一次转换16进制。 加密的主要方案在于 数字左移和补最高位,鉴于base64的高效,所以使用base64encode来美化ID
*
* base64加密效率: 加密 1 - 2千万 1s以内完成
*/
public class IdMakeUtil implements Authorization {
private static final Base64.Encoder encoder = Base64.getEncoder();
private static final Base64.Decoder decoder = Base64.getDecoder();
private static final String PREFIX = "Kj2";
private IdMakeUtil(){}
public static String encodingId(Long id) {
id = (id << 3) ^ 7;
String encode = encoder.encodeToString(Long.toString(id).getBytes());
String replace = encode.replace("=", "");
return PREFIX + (encode.length() - replace.length()) + replace;
}
public static Long decodingId(String encode) {
if (StringUtils.isBlank(encode)) {
return null;
}
try {
StringBuilder substring = new StringBuilder(encode.substring(4));
String decode = new String(decoder.decode(substring.toString()));
return Long.valueOf(decode) >> 3;
} catch (Exception e) {
return null;
}
}
public static String managerEncodingId(long id) {
BaseUtils.ssoLogin();
Map<String, Object> ids = new HashMap<>();
ids.put("code", id);
// System.out.println("input: "+id);
Response encodeIdRes = network.getResponse(ids, BasicConfig.MANAGER_ID_ENCODE);
// System.out.println("encodeIdRes: "+encodeIdRes.body().asString());
String encodeId = encodeIdRes.jsonPath().getString("data");
Assert.assertNotNull(encodeId, network.message(ids, BasicConfig.MANAGER_ID_ENCODE, "加密id失败", encodeIdRes.body().asString()));
return encodeId;
}
public static long managerDecodeingId(String code) {
BaseUtils.ssoLogin();
Map<String, Object> decodePar = new HashMap<>();
decodePar.put("code", code);
Response decodeRes = network.getResponse(decodePar, BasicConfig.MANAGER_ID_DECODE);
long decodeId = 0;
try {
decodeId = decodeRes.jsonPath().getLong("data");
}catch (NullPointerException e){
e.printStackTrace();
}
return decodeId;
}
public static String encodingId(Long id, IdConvertBase64Enum base64Enum) {
if (id == null || base64Enum == null || base64Enum.getCode().length() != 3) {
return null;
}
id = (id << 3) ^ 7;
String encode = encoder.encodeToString(Long.toString(id).getBytes());
String replace = encode.replace("=", "");
return base64Enum.getCode() + (encode.length() - replace.length()) + replace;
}
}
package com.oto.utils;
import com.oto.config.BasicConfig;
import com.oto.sql.KjyUserDB;
import com.oto.sql.UserSqlFactory;
import io.restassured.response.Response;
import org.testng.Assert;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JmeterAccountFile {
private static final NetworkUtils network = NetworkUtils.getInstance();
public static void main(String[] args) {
// String path = String.valueOf(JmeterAccountFile.class.getResource("/"));
// accountFile(path);
otoCookieMaker();
}
/**
* 生成otoCookie,仅用于压力测试文件
*/
public static void otoCookieMaker() {
}
//仅用于生成直播账号Authkey文件
public static void accountFile(String path) {
BaseUtils.ssoLogin();
// 保存路径
String file = path + "AccountFile.txt";
// 防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw
try {
File accountFile = new File("AccountFile.txt");// 相对路径,如果没有则要建立一个新的output。txt文件
// 判断文件是否存在,不存在即新建
if(!accountFile.exists()) {
accountFile.createNewFile(); // 创建新文件
}
// 如果是在原有基础上写入则append属性为true,默认为false
BufferedWriter out = new BufferedWriter(new FileWriter(accountFile,true));
//获取直播用户id
List<Map<String, Object>> result = KjyUserDB.getInstance().findModeResult(UserSqlFactory.selectUserIdForJmeter);
for (Map<String, Object> item:result
) {
System.out.println(item.get("id"));
Map<String, Object> subscribeParam = new HashMap<>();
subscribeParam.put("liveUserId", item.get("id"));
subscribeParam.put("validDays", 365);
Response subscribeRes = network.getResponse(subscribeParam, BasicConfig.MANAGER_encryptAuthKey);
String data = subscribeRes.jsonPath().getString("data");
Assert.assertNotNull(data, network.message(subscribeParam, BasicConfig.MANAGER_encryptAuthKey, "增加测试用户失败", subscribeRes.body().asString()));
System.out.println(data);
out.write(data+"\t\n"); // 写入TXT
out.flush(); // 把缓存区内容压入文件
}
out.close(); // 最后记得关闭文件
} catch (SQLException throwables) {
throwables.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
package com.oto.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import groovy.json.JsonBuilder;
import io.restassured.response.Response;
import java.util.List;
import java.util.Map;
public class JsonUtil {
private JsonUtil() {
}
public static <T> T parseResponseToBeanTT(Response response, Class<T> tClass) {
Object data = response.jsonPath().getJsonObject("d");
String str = new JsonBuilder(data).toString();
return JSON.parseObject(str, tClass);
}
/**
* 将响应转换成对象
* @param response
* @param tClass
* @param <T>
* @return
*/
public static <T> T parseResponseToBean(Response response, Class<T> tClass){
Object data = response.jsonPath().getJsonObject("data");
String str = new JsonBuilder(data).toString();
return JSON.parseObject(str, tClass);
}
/**
* 分页接口专用-将响应转换成对象
* @param response
* @param tClass
* @param <T>
* @return
*/
public static <T> List<T> parseResponseToPageBean(Response response, Class<T> tClass){
return parseResponseToPageBean(response, tClass,"list");
}
/**
* 分页接口专用-将响应转换成对象
* @param response
* @param tClass
* @param <T>
* @return
*/
public static <T> List<T> parseResponseToPageBean(Response response, Class<T> tClass,String listName){
Object data = response.jsonPath().getJsonObject("data");
String str = new JsonBuilder(data).toString();
JSONObject jsonObject = JSON.parseObject(str);
JSONArray array = jsonObject.getJSONArray(listName);
return array.toJavaList(tClass);
}
public static <T> List<T> parseResponseToListBean(Response response, Class<T> tClass){
Object data = response.jsonPath().getJsonObject("data");
String str = new JsonBuilder(data).toString();
return JSON.parseArray(str, tClass);
}
public static <T> List<T> parseResponseToListBean(Response response, Class<T> tClass, String listName){
Map map = response.jsonPath().getJsonObject("data");
Object data = map.get(listName);
String str = new JsonBuilder(data).toString();
return JSON.parseArray(str, tClass);
}
public static <T> List<T> parseResponsePathToListBean(Response response, String path,Class<T> tClass){
Object data = response.jsonPath().getJsonObject(path);
String str = new JsonBuilder(data).toString();
return JSON.parseArray(str, tClass);
}
}
package com.oto.utils;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.enums.ReadyState;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
/**
* WebSocket工具类
* @author lizhi
* @date 2021/4/19 4:00 下午
*/
public class MyWebSocketUtil {
private static final String URL = "wss://ws.duibatest.com.cn/kws";
private MyWebSocketUtil() {
}
public static void main(String[] args) {
String authKey = "zFNkBc7JtvLPL6ifAfXbcgYH7WrugVmhv4CXQVq1CN1Y2C8pcBXoPvUPFbkWj7HbdkFpe4oX6SLjczK3ruYpQ8EaQ5";
String liveId= "Kj21MjMzMTE";
//连接
MyWebSocketClient client = connect();
//身份认证,识别用户信息
auth(client, authKey);
//进入直播间
enter(client, liveId);
//循环发送心跳,长时间不发消息,链接会断开
for (int i = 0; i < 5; i++) {
hb(client);
ThreadSleepUtils.sleep(5000);
}
//退出直播间
out(client, liveId);
//无意义命令
gt(client);
//关闭连接
close(client);
}
/**
* 创建链接
* @param url 需要链接的地址
* @return WebSocket客户端
*/
public static MyWebSocketClient connect(String url) {
MyWebSocketClient client = new MyWebSocketClient(URI.create(url));
client.connect();
int maxCount = 10;
int count = 0;
// 判断是否连接成功,未成功后面发送消息时会报错
while (!client.getReadyState().equals(ReadyState.OPEN)) {
ThreadSleepUtils.sleep(500);
count++;
if (count >= maxCount) {
System.out.println("WebSocketClient, connect, fail, url=" + url);
return null;
}
}
System.out.println("WebSocketClient, connect, url=" + url);
return client;
}
public static MyWebSocketClient connect() {
return connect(URL);
}
/**
* 授权
* @param client WebSocket客户端
* @param authKey 用户加密信息
*/
public static void auth(WebSocketClient client, String authKey) {
sendTextMsg(client, WebSocketConstant.AUTH_OP + WebSocketConstant.MESSAGE_BODY_SPLIT + authKey);
}
/**
* 进入直播间
* @param client WebSocket客户端
* @param liveId 加密的直播ID
*/
public static void enter(WebSocketClient client, String liveId) {
sendTextMsg(client, WebSocketConstant.ENTER_LIVE_OP + WebSocketConstant.MESSAGE_BODY_SPLIT + liveId + WebSocketConstant.MESSAGE_BODY_SPLIT + "2");
}
/**
* 退出直播间
* @param client WebSocket客户端
* @param liveId 加密的直播ID
*/
public static void out(WebSocketClient client, String liveId) {
sendTextMsg(client, WebSocketConstant.OUT_LIVE_OP + WebSocketConstant.MESSAGE_BODY_SPLIT + liveId);
}
/**
* 发送心跳
* @param client WebSocket客户端
*/
public static void hb(WebSocketClient client) {
sendTextMsg(client, WebSocketConstant.HEART_BEAT);
}
/**
* 无意义命令,用来判断链接是否还可用
* @param client WebSocket客户端
*/
public static void gt(WebSocketClient client) {
sendTextMsg(client, WebSocketConstant.GREETING_OP);
}
/**
* 关闭链接
* @param client WebSocket客户端
*/
public static void close(WebSocketClient client) {
client.closeConnection(0, "ok");
}
/**
* 发送消息
* @param client WebSocket客户端
* @param msg 要发送的消息
*/
private static void sendTextMsg(WebSocketClient client, String msg) {
client.send(msg);
System.out.println("WebSocketClient, sendTextMsg, msg=" + msg);
}
static class WebSocketConstant {
private WebSocketConstant() {}
/**
* websocket消息体的指令和body分隔符
*/
public static final String MESSAGE_BODY_SPLIT = "\r\n";
/**
* websocket身份认证指令
*/
public static final String AUTH_OP = "th";
/**
* ws进入直播指令
*/
public static final String ENTER_LIVE_OP = "en";
/**
* ws退出直播指令
*/
public static final String OUT_LIVE_OP = "out";
/**
* 前端验证通信指令,无意义
*/
public static final String GREETING_OP = "gt";
/**
* 心跳
*/
public static final String HEART_BEAT = "/hb";
}
static class MyWebSocketClient extends WebSocketClient {
public MyWebSocketClient(URI serverUri) {
super(serverUri);
}
@Override
public void onOpen(ServerHandshake serverHandshake) {
System.out.println("WebSocketClient, onOpen");
}
@Override
public void onMessage(String s) {
System.out.println("WebSocketClient, onMessage, s=" + s);
}
@Override
public void onClose(int code, String reason, boolean remote) {
System.out.println("WebSocketClient, onClose, code="+ code+", reason=" + reason + ", remote="+remote);
}
@Override
public void onError(Exception e) {
System.out.println("WebSocketClient, onError, e:"+ e.getMessage());
}
}
}
\ No newline at end of file
package com.oto.utils;
import static com.oto.config.BasicConfig.*;
import static io.restassured.RestAssured.*;
import com.alibaba.fastjson.JSONObject;
import io.restassured.response.Response;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class NetworkUtils {
// 代理人的 cookies和headers
public Map<String, Object> agentCookies = new HashMap<String, Object>();
public Map<String, Object> agentHeaders = new HashMap<String, Object>();
public Map<String, Object> fileHeaders = new HashMap<String, Object>();
// 钉钉的 headers
public Map<String, Object> dingTalkHeaders = new HashMap<String, Object>();
private volatile static NetworkUtils network;
// 构造函数 初始化tku、content-type
private NetworkUtils(){
//cookies中的tku
agentCookies.put("tku",AGENT_TKU);
//多场景测试标志
// agentCookies.put("_duibaServiceGroupKey","miria-2652");
//json类型的headers
agentHeaders.put("Content-Type","application/json");
//二进制文件的headers
fileHeaders.put("Content-Type","multipart/form-data");
//钉钉的headers
dingTalkHeaders.put("Content-Type","application/json;charset=utf-8");
}
//单例模式
//通过设置同步代码块,使用DCL双检查锁机制
//使用双检查锁机制成功的解决了单例模式的懒汉实现的线程不安全问题和效率问题
//DCL 也是大多数多线程结合单例模式使用的解决方案
public static NetworkUtils getInstance() {
if (network == null) {
synchronized (NetworkUtils.class) {
if (network == null) {
network = new NetworkUtils();
}
}
}
return network;
}
// get 不带参请求
public Response getResponse(String path) {
Response response = given()
.cookies(agentCookies)
.headers(agentHeaders)
.get(path);
if (!Objects.equals(response.statusCode(),200)){
System.out.println("请求状态码错误,path=【"+path+"】 code=【"+response.statusCode()+"】");
}
System.out.println(response.body().asString());
return response;
}
// get 带参请求
public Response getResponse(Map<String, Object> params, String path) {
Response response = given()
.cookies(agentCookies)
.headers(agentHeaders)
.params(params)
.get(path);
if (!Objects.equals(response.statusCode(),200)){
System.out.println("请求状态码错误,path=【"+path+"】 code=【"+response.statusCode()+"】");
}
System.out.println(response.body().asString());
return response;
}
// post 不帶参请求
public Response postResponse(String path) {
Response response = given()
.cookies(agentCookies)
.headers(agentHeaders)
.post(path);
if (!Objects.equals(response.statusCode(),200)){
System.out.println("请求状态码错误,path=【"+path+"】 code=【"+response.statusCode()+"】");
}
System.out.println(response.body().asString());
return response;
}
// post 带参请求
public Response postResponse(Map<String, Object> params, String path) {
String jsonStr = JSONObject.toJSONString(params);
Response response = given()
.cookies(agentCookies)
.headers(agentHeaders)
.body(jsonStr)
.post(path);
if (!Objects.equals(response.statusCode(),200)){
System.out.println("请求状态码错误,path=【"+path+"】 code=【"+response.statusCode()+"】");
}
System.out.println(response.body().asString());
return response;
}
// post 头部带参请求
public Response postHeaderResponse(Map<String, Object> params, String path) {
Response response = given()
.cookies(agentCookies)
.params(params)
.post(path);
if (!Objects.equals(response.statusCode(),200)){
System.out.println("请求状态码错误,path=【"+path+"】 code=【"+response.statusCode()+"】");
}
System.out.println(response.body().asString());
return response;
}
// post 文件上传
public Response postFileResponse(String filePath, String path){
Response response = given()
.cookies(agentCookies)
.headers(fileHeaders)
.multiPart("file",new File(filePath))
.post(path);
if (!Objects.equals(response.statusCode(),200)){
System.out.println("请求状态码错误,path=【"+path+"】 code=【"+response.statusCode()+"】");
}
return response;
}
// post xml请求方式
public Response postXMLResponse(String str, String path) {
Response response = given()
.cookies(agentCookies)
.headers(agentHeaders)
.body(str)
.post(path);
if (!Objects.equals(response.statusCode(),200)){
System.out.println("请求状态码错误,path=【"+path+"】 code=【"+response.statusCode()+"】");
}
return response;
}
// 管理后台
public Response getManagerCookies(String path){
Response response = given().
cookies(agentCookies).
redirects().
follow(false).
get(path);
if (!Objects.equals(response.statusCode(),200)){
System.out.println("请求状态码错误,path=【"+path+"】 code=【"+response.statusCode()+"】");
}
return response;
}
// post 钉钉机器人
public Response dingTalkRobot(Map<String, Object> params) {
String jsonStr = JSONObject.toJSONString(params);
Response response = given()
.headers(dingTalkHeaders)
.body(jsonStr)
.post(dingTalkPath);
if (!Objects.equals(response.statusCode(),200)){
System.out.println("请求状态码错误,code=【"+response.statusCode()+"】");
}
return response;
}
/**
* 带参的接口完整信息
* @param params 接口参数
* @param path 接口路径
* @param errorMessage 自己打印的错误信息
* @param responseBody 返回的response
* @return 完整的接口信息
*/
public String message(Map<String, Object> params, String path, String errorMessage, String responseBody){
return "\n" + "path: " + path +
"\n" + "params: " + params +
"\n" + "message: " + errorMessage +
"\n" + "response:" + responseBody + "\n";
}
/**
* 不带参的接口完整信息
* @param path 接口路径
* @param errorMessage 自己打印的错误信息
* @param responseBody 返回的response
* @return 完整的接口信息
*/
public String message(String path, String errorMessage, String responseBody){
return "\n" + "path: " + path +
"\n" + "message: " + errorMessage +
"\n" + "response:" + responseBody + "\n";
}
}
package com.oto.utils;
//延时
public class ThreadSleepUtils {
private ThreadSleepUtils() {}
public static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="客集集" verbose="1" thread-count="3">
<suite-files>
<suite-file path="workTestNG.xml"></suite-file>
</suite-files>
<!-- 监听器-->
<listeners>
<listener class-name="com.oto.config.ExtentTestNGIReporterListener"/>
</listeners>
</suite>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="保险OTO" verbose="1" thread-count="3">
<test preserve-order="true" name="销售管理">
<classes>
<class name="com.oto.cases.otoseller.Manager"/>
</classes>
</test>
<test preserve-order="true" name="销售工作台PC端">
<classes>
<class name="com.oto.cases.otoseller.Work"/>
</classes>
</test>
<test preserve-order="true" name="销售工作台手机端">
<classes>
<class name="com.oto.cases.otoseller.Phone"/>
</classes>
</test>
</suite>
<!-- Suite -->
<!--
suite定义一个测试套件,可以设置是否使用多线程,可包含多个测试用例或者测试group
parallel = classes  每个测试用例class级别多线程
thread-count =3  线程数为5,可同时执行3个case
preserve-order = true   classes和methods按照配置中的顺序执行,false为乱序执行。(If you want the classes and methods listed in this file to be run in an unpredictible order, set the preserve-order attribute to false)
parameter 标签传递参数
-->
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment