利用Feign测试Rest Api

引言

如何让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进行处理,非常感谢!

上一篇 2020年7月9日
下一篇 2020年7月9日

相关推荐