引言
如何让Rest Api测试更容易,并且和开发代码更有关联性呢,看完这篇文件就明白了。
现在最主流微服务框架是Spring Cloud,通常以Consul或Eureka做注册中心,然后所有服务都注册在注册中心上。当时我们测试时可以使用Rest-Assured或者自己开发HttpClient来测试Rest Api。 这次我提供一种不同方法,把测试应用当成一个消费者用Feign来直接测试Rest Api。好处是我们可以写更少的代码,并且更加容易。
新建一个测试项目
我们可以用IDEA新一个Spring Boot项目。然后引用以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.3.RELEASE</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.0.RELEASE</version></dependency><dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.11</version></dependency>
Application.yml
如果创建的是Spring Boot项目的话默认会生成一个Application.properties.把后缀号改为yml或者yaml。配置大概如下:
eureka: client: serviceUrl: defaultZone: http://172.xx.xx.xx:9000/eureka/ #Eureka的注册中心server: port: 8765spring: application: name: demo-autoribbon: ReadTimeout: 120000 #请求处理的超时时间 ConnectTimeout: 30000 #请求连接的超时时间
DemoAutoApplication
Spring Boot应用的启动类配置如下:
@SpringBootApplication@EnableDiscoveryClient@EnableFeignClientspublic class DemoAutoApplication {? public static void main(String[] args) { SpringApplication.run(DemoAutoApplication.class, args); }?}
接口Service
假设注册中心上有一个叫service-account的微服务,我们想测试login方法。我们需要创建一个RemoteAccountService的接口,此接口和开发定义接口内容相同,如果和开发代码在同一个工程可以直接使用原有的,内容如下:
@EnableFeignClients@FeignClient(value = "service-account",configuration= FeignConfiguration.class)public interface RemoteAccountService { @RequestLine("POST /account/login") Result<RemoteAccountRsp> login(@RequestBody RemoteAccountLoginReq req);}?
业务流Flow
做自动化测试时,我习惯封装一些公共方法叫Flow,内容如下:
@Componentpublic class AccountFlow { @Autowired RemoteAccountService accountService; public Result<RemoteAccountRsp> login(){ RemoteAccountLoginReq loginReq = new RemoteAccountLoginReq(); loginReq.setAccount("username"); loginReq.setPassword("123456"); Result<RemoteAccountRsp> result = accountService.login(loginReq); return result; }}
测试用例Test
@SpringBootTestpublic class AccountTests extends AbstractTestNGSpringContextTests { @Resource AccountFlow accountFlow; @Test public void login(){ Result<RemoteAccountRsp> result = accountFlow.login(); Assert.assertEquals(result.getMessage(),"登录成功"); }}
如果TestNG测试类中使用Spring一定要记得继承AbstractTestNGSpringContextTests 否则无法注入Bean。
控制台让人讨厌警告
完成上面步骤应该,可以正常启动Spring,并且执行用例成功。但是你会发现控制台打了很多警告,对于有洁癖的人来说很不舒服。你可以在项目中加入一个类。
/** * 消除日志里Feign报的错 */@Componentpublic class FeignBeanFactoryPostProcessor implements BeanFactoryPostProcessor {? @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { if (containsBeanDefinition(beanFactory, "feignContext", "eurekaAutoServiceRegistration")) { BeanDefinition bd = beanFactory.getBeanDefinition("feignContext"); bd.setDependsOn("eurekaAutoServiceRegistration"); } }? private boolean containsBeanDefinition(ConfigurableListableBeanFactory beanFactory, String... beans) { return Arrays.stream(beans).allMatch(b -> beanFactory.containsBeanDefinition(b)); }}
结语
这里仅仅是抛砖引玉。如果你们的应用部署到K8S里,可能会无法注册到注册中心,因为K8S内是一个独立的网络。
参考
https://dzone.com/articles/rest-api-testing-with-spring-cloud-feign-clients
来源:良测软件测试
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!