一个进阶的过程吧,遇到问题学会举一反三、记录、总结。防止在一个问题上反复试错。
从功能测试 到 自动化测试 ,记录出现过的每一个问题。【ps. 框架 导师已经搭建好了】
一、问题描述:执行DEMO用例时,报错:Timed out waiting for driver server to start.
问题原因: 我的chrome浏览器版本(99) 和 ChromeDriver版本(98) 不一致导致的。
解决方法:下载和chrome浏览器版本一致的driver即可,记得区分win、mac版本。https://chromedriver.chromium.org/downloads。 我的电脑是64位的,下载的win32的也能使用。
二、问题描述:IDEA自动编译
解决方法:勾选上即可
三、问题描述:Run/Debug了demotest,项目构建有时会失败
问题原因:Run/Debug算是启动了chromedriver
解决方法:任务管理器中删除所有启动的chromedriver进程即可。
问题反思:为啥任务管理器中会有这么多的chromedriver,反馈给导师后,他建议把driver.quit,替换成 driver.close();
@AfterSuite
public void afterSuit() {
if (driver != null) {
driver.quit();
}
log.info(StringOpeUtils.genDelimiter("测试结束"));
}
四、问题描述:打不开IDEA中的终端,报错:Cannot open Local Terminal Failed to start [powershell.exe] in ***
解决方法:将Shell路径替换成本机的shell路径,重新打开IDEA中的终端即可
五、整理项目中P0级别测试点,记录接口地址,方法,传参,返回值等基本信息,以及具体的使用场景,以及返回值的常见断言。
简单示例
@TestConfig(fPath = "testdata/compare/biz/createBiz/createBizTest.json")
@Test(description = "创建空间,传参正常的值,空间名称加当前时间戳")
public void createBizTest() {
JSONObject requestObj = JSONObject.parseObject(paramsModel.getRequest());
requestObj.put("bizId",requestObj.getString("bizId") + new Date().getTime());
requestObj.put("bizName",requestObj.getString("bizName")+ new Date().getTime());
String res = biz.create(requestObj.toJSONString());
paramsModel.setActualResp(res);
AssertUtils.commonAssert();
}
六、问题描述:Assert.assertEquals作用、assertSame的作用
七、问题描述:JSONObject.parseObject(paramsModel.getResponse()),报错com.alibaba.fastjson.jsonexception: syntax error, pos 1, line 1, column 2
自己花蛮长时间搜索解决方法,还是无法修复,就寻求导师帮助。导师通过本地、postman的两次验证,发现是接口返回的类型从普通json格式变成了html格式了。
解决方法:在header中增加了("Accept","application/json")。后经证实是开发修改了配置文件导致的。
问题总结:学会使用postman工具来排查是后台接口问题,还是自动化测试脚本的问题。
八、问题描述:IntelliJ IDEA 报错:找不到包或者找不到符号
解决方法:删除target文件后,pom文件右键 重新构建项目即可。
九、问题描述:clone项目到本地其他路径,打开IDEA,执行报错:java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.util.Map sun.reflect.annotation.AnnotationInvocationHandler.memberValues accessible: module java.base does not "opens sun.reflect.annotation" to unnamed module @7a0ac6e3
解决方法:运行/调试配置JRE换成最新的jdk
十、路径中含有参数GET请求,如何获取参数。 直接放在路径中,放在参数urlParams
@ApiConf(uri = "***/data_resource/{data_resource_id}?__ilike={__ilike}&biz_url={biz_url}", requestMethod = RequestMethod.GET)
public String eventConfList(String params, String urlParams) {
return null;
}
十一、IDEA快捷键:选中代码后,移动一行在主菜单上选择 代码| 向上移动(Code | Move Line Up)或代码| 向下移动(Code | Move Line Down)。按Shift+Alt+Up 或Shift+Alt+Down。
十二、将json字符串中的对象list转换成 对象model
JSONArray reqObj = JSONObject.parseObject(paramsModel.getRequest()).getJSONArray("event_list");
List eventModels = JSONArray.parseArray(JSONObject.toJSONString(reqObj), EventModel.class);
十三、Java中判断list为空(CollectionUtils.isEmpty)
十四、包含不区分大小写:
org.apache.commons.lang3.StringUtils.containsIgnoreCase(CharSequence str,CharSequence searchStr);
十五、记得之前参考导师代码时,发现他类里面的方法命名有时候就是Test01、Test0102、***Test0103,我当时还不以为然,这样命名太随意了吧。指导我写了三周代码,我发现了他的明智。 否则真的太冗余。 我屁颠屁颠的改了一版,去除冗余,一目了然,不向我之前看起来命名太长,累。
十六、问题描述:【第二次遇到这个问题了】执行报错java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.util.Map
参考原因:
解决方法:
十七、新增加了功能,运行时报错:
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.beacon.apitest.BeaconApiTestApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'dataResource' for bean class [com.beacon.apitest.api.plugin.DataResource] conflicts with existing, non-compatible bean definition of same name and class [com.beacon.apitest.api.dataResorce.DataResource]
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:189) ~[spring-context-5.3.3.jar:5.3.3]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:336) ~[spring-context-5.3.3.jar:5.3.3]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:252) ~[spring-context-5.3.3.jar:5.3.3]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:285) ~[spring-context-5.3.3.jar:5.3.3]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:99) ~[spring-context-5.3.3.jar:5.3.3]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:751) ~[spring-context-5.3.3.jar:5.3.3]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:569) ~[spring-context-5.3.3.jar:5.3.3]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.2.jar:2.4.2]
问题原因:在报错中的前几行就能看到 Annotation-specified bean name 'dataResource' for bean class [com.beacon.apitest.api.plugin.DataResource] conflicts with existing。 出现类名冲突了。
解决方法:把重名的类换个名字即可。
十八、运行报错:
十九、testNG,@ApiConfig中如何给参数赋值
@ApiConf(uri = "/webserver/data_resource/{resourceId}?ba_key={ba_key}&biz_url={biz_url}&log_trace_id={log_trace_id}", requestMethod = RequestMethod.DELETE)
public String dataResourceDelete(String urlParams) {
return null;
}
二十、写代码有2个月了吧, 总想着一次就写的很好很好,最简方法、最优方案。 其实不是的。最起码要先实现,然后再优化。