话说:
各位读者盆友,晚上好!这里跟大家分享一下自动化测试过程中的小封装。
目录
一、背景
二、案例
三、总结
一、背景
在写自动化测试时候,用的是Rest-Assured框架,在自动创建各种账号的时候,遇到很多次这种情形:
eg:
用户提出一个申请==》BOSS端审核 =》结果。
今天就围绕这么一个简单的过程来体会看下回顾下自己的封装过程。
二、案例
版本一:
环节1:提出申请
public boolean getRealNameIdentificationByUserName(TestUsers user) throws AuthException, IOException {
String temporyUserName = user.getUserName();
String temporyPassword = user.getPassword();
user.setUserName("jiawei|"+user.getUserName());
user.setPassword("888888");
String userToken = AuthProvider.auth(user);
System.out.println("得到用户的Token是:"+userToken);
user.setUserName(temporyUserName);
user.setPassword(temporyPassword);
Object obj = RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,userToken)
.body(UserFactory.createRandomRealNameIdentificationCommand(user))
.post(URLConstant.BDC_USER_REAL_NAME_APPLY)
.then().log().all()
.statusCode(200)
.extract().path("data");
System.out.println("实名认证请求结果: "+obj);
return (boolean)obj;
}
环节2:获取申请ID。
//获取实名认证申请ID
public int getRealNameApplicationId(TestUsers user) {
List<HashMap> applicationList = RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.when()
.get(URLConstant.BDC_USER_REAL_NAME_APPLY_LIST)
.then().log().all()
.statusCode(200)
.extract().path("data");
int applicationId = 0;
for(int i=0;i<applicationList.size();i++) {
if(applicationList.get(i).get("name").equals(user.getUserName())) {
System.out.println("遇到相等的ID拉? ");
applicationId = (int)applicationList.get(i).get("id");
}
}
return applicationId;
}
环节3:BOSS端审核通过或者不通过
//BOSS端审核通过
public boolean getIdentifyRealNameByBoss(int applicationId,boolean approved ) {
Object obj = null;
if(approved) {
IdentifyRealNameCommand identifyRealNameCommand = new IdentifyRealNameCommand();
identifyRealNameCommand.setApplicationId((long)applicationId);
identifyRealNameCommand.setApproved(approved);
obj = RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.body(identifyRealNameCommand)
.post(URLConstant.BDC_USER_REAL_NAME_APPLY_AUDIT)
.then().log().all().statusCode(200)
.extract().jsonPath().get("data");
System.out.println("BOSS端审核通过结果:"+obj);
}
return (boolean)obj;
}
//BOSS端审核不通过
public boolean getIdentifyRealNameByBoss(int applicationId,boolean approved,String comment) {
Object obj = null;
if(!approved) {
IdentifyRealNameCommand identifyRealNameCommand = new IdentifyRealNameCommand();
identifyRealNameCommand.setApplicationId((long)applicationId);
identifyRealNameCommand.setApproved(approved);
identifyRealNameCommand.setComment(comment);
obj = RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.body(identifyRealNameCommand)
.post(URLConstant.BDC_USER_REAL_NAME_APPLY_AUDIT)
.then().log().all().statusCode(200)
.extract().jsonPath().get("data");
System.out.println("BOSS端实名认证 审核不通过结果:"+obj);
}
return (boolean)obj;
}
认真看下前面的内容,后面主要针对获取申请ID和BOSS端审核2个方法进行优化。
版本二
我们先来看BOSS端获取申请ID方法的优化过程:
//1.返回申请ID
public static int getUserQualficationApplicationId(TestUsers user) {
List<HashMap> applicationList = RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.when()
.param("status","WAIT_TO_AUDIT")
.param("limit",1000)
.get(URLConstant.BDC_DOCTORS_CERTIFICATION_APPLICATIONS)
.then().log().all()
.statusCode(200)
.extract().path("data");
int applicationId = 0;
for(int i=0;i<applicationList.size();i++) {
if(user.getUserName() != null){
if(applicationList.get(i).get("name").equals(user.getUserName())) {
System.out.println("遇到相等的ID拉? ");
applicationId = (int)applicationList.get(i).get("id");
}
}
}
return applicationId;
}
这里存在什么问题?
有几个地方写固定了,比如:
1)申请的状态,.param(“status”,“WAIT_TO_AUDIT”)
在BOSS端,申请的列表可能有几种状态:待审核、已通过、已驳回,不同的审核列表表述还可能不一样。所以这里写死,意味着每次都得改。
2) .get(URLConstant.BDC_DOCTORS_CERTIFICATION_APPLICATIONS)
URL写固定了,最不好。不同的申请,调用的接口都不同,写死了就意味着今天实名认证申请,你的更换URL;明天医学联络官申请,你的更换URL;后天病历运维专家申请,你也得更换URL…
3)if(applicationList.get(i).get(“name”).equals(user.getUserName()))
遍历判断什么时候返回ID的时候,需要比较的条件写固定了。这里也不好,今天可能比较的是name,明天可能比较的是userName.
所以,接下来优化这几个地方。
//BOSS端获取申请ID
public int getApplicationId(TestUsers user,String applicationStatus,String url,String comparationAttribute ) {
List<HashMap> applicationList = RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.param("applicationStatus",applicationStatus)
.param("limit",1000)
.get(url)//BDC_CASE_EXPERT_CASE_EXPERT_APPLICATION_LIST
.then().log().all()
.statusCode(200).extract().path("data");
System.out.println("得到的申请列表是:"+applicationList);
int applicationId = 0;
//遍历列表,获取申请id
for(int i=0;i<applicationList.size();i++) {
if(applicationList.get(i).get(comparationAttribute).equals(user.getUserName())) {
System.out.println("找到啦"+applicationList.get(i).get("id"));
applicationId = (int)applicationList.get(i).get("id");
}
}
return applicationId;
}
参数都抽离出来,只要是类似的申请,在BOSS端都可以返回申请ID,非常灵活。
版本三
最后优化BOSS端审核方法
1)实名认证申请:
//BOSS端审核通过
public boolean getIdentifyRealNameByBoss(int applicationId,boolean approved ) {
Object obj = null;
if(approved) {
IdentifyRealNameCommand identifyRealNameCommand = new IdentifyRealNameCommand();
identifyRealNameCommand.setApplicationId((long)applicationId);
identifyRealNameCommand.setApproved(approved);
obj = RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.body(identifyRealNameCommand)
.post(URLConstant.BDC_USER_REAL_NAME_APPLY_AUDIT)
.then().log().all().statusCode(200)
.extract().jsonPath().get("data");
System.out.println("BOSS端审核通过结果:"+obj);
}
return (boolean)obj;
}
这里的2个参数完全是多余的,直接可以把command扔进去即可。一般>3个参数,就封装成一个Command,不要让一个方法带有过多参数,显得混乱。
2)这是医生资质申请:
//2.审核通过
public void identifyDoctorQualification(IdentifyDoctorQualificationCommand command){
RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.body(command)
.post(URLConstant.BDC_DOCTORS_CERTIFICATION_AUDIT)
.then().log().all()
.statusCode(200);
}
3)病历运维专家申请通过:
//BOSS端审核通过
public void approvedByBoss(IdentifyCaseExpertCommand command) {
RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.body(command)
.post(URLConstant.BDC_CASE_EXPERT_AUDIT_CASE_EXPERT_APPLICATION)
.then().log().all()
.statusCode(200);
}
看到这里,相同的方法重复了3遍!本质都是审核通过一个申请,所以抽离出来。
//BOSS端审核通过完全可以抽离出来
public void approvedByBoss(Object obj,String operatorToken,String url) {
RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.body(obj)
.post(url)
.then().log().all()
.statusCode(200);
}
所以 BOSS端获取申请ID=》BOSS端审核通过整体封装如下:
//BOSS端获取申请ID
public int getApplicationId(TestUsers user,String applicationStatus,String url,String comparationAttribute ) {
List<HashMap> applicationList = RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.param("applicationStatus",applicationStatus)
.param("limit",1000)
.get(url)//BDC_CASE_EXPERT_CASE_EXPERT_APPLICATION_LIST
.then().log().all()
.statusCode(200).extract().path("data");
int applicationId = 0;
//遍历列表,获取申请id
for(int i=0;i<applicationList.size();i++) {
if(applicationList.get(i).get(comparationAttribute).equals(user.getUserName())) {
applicationId = (int)applicationList.get(i).get("id");
}
}
return applicationId;
}
//BOSS端审核
public void approvedByBoss(Object obj,String operatorToken,String url) {
RestAssured.given().log().all()
.contentType(ContentType.JSON)
.cookie(AuthProvider.DZJ_TOKEN,operatorToken)
.body(obj)
.post(url)
.then().log().all()
.statusCode(200);
}
以上代码就很通用了。
三、总结
总结:多写,多写,多写。
再会!