API에 대해 테스트하기에 매우 편리하고 각 커밋을 확인하기 위해 CI에 통합하려면 Spring Boot에 포함 된 것이 최선의 선택입니다.
테스트 케이스를 빨리 작성하십시오
@runwith (springrunner.class) @springboottest (webenvironment = springboottest.webenvironment.random_port) @ActiveProfiles ({profiles.env_it}) 공개 클래스 DemointegrationTest {@autowired private fooservice fooservice; @test public void test () {System.out.println ( "테스트"); }}그중에서도 SpringBoottest는 실행할 때 일부 구성을 정의합니다. 위의 코드는 임의의 포트를 사용하며 물론 이와 같은 포트를 사전 정의 할 수도 있습니다.
@SpringBoottest (WebEnvironment = SpringBoottest.WebenVironment.Defined_port, Properties = { "Server.port = 9990"})ActiveProfiles는 IT 프로파일을 사용합니다. 모범 사례에서 IT 프로파일로 구성된 데이터베이스 또는 기타 리소스 구성 요소의 주소는 개발 또는 준비 환경에서 격리되어야합니다. IT가 많은 상황을 통과 할 때 테스트 데이터를 지워야합니다.
그러한 사례는 원하는 서비스에 자동으로 주입 할 수 있음을 알 수 있습니다. 이는 스프링이 전체 컨텍스트를로드하기 때문에 데이터베이스, 캐시 및 기타 구성 요소를 포함하여 실제 실행 환경과 동일합니다. 테스트 중에 모든 리소스가 필요하지 않다고 생각되면 프로필에서 해당 구성을 삭제할 수 있습니다. 이것은 완전한 운영 환경입니다. 유일한 차이점은 사용 사례가 완료된 후 자동으로 종료된다는 것입니다.
REST API를 테스트하십시오
Gradle에 추가 할 라이브러리를 적극 권장합니다
TestCompile 'IO.Rest-Assured : REST-ASSURED : 3.0.3'
매우 유용한 JSONPATH를 지원하십시오. 특정 문서를 보려면 여기를 클릭하십시오
@sql (scripts = "/testdata/users.sql")@testpublic void test001login () {String username ="[email protected] "; 문자열 암호 = "데모"; JWTAYTENTICATIONREQUEST 요청 = NEW JWTAYTENTICATIONREQUEST (사용자 이름, 비밀번호); 응답 응답 = 주어진 (). contenttype (contenttype.json) .body (request) .when (). post ( "/auth/login"). () .statuscode (httpstatus.ok.value ()) .extract (). response (); AssertThat (response.path ( "Token"), is (isnull.NOTNULLVALUE ())); AssertThat (response.path ( "만료"), is (isnull.nollvalue ());} @SQL은 테스트하기 전에 SQL 삽입 테스트 데이터를 수행하는 데 사용됩니다. given().body() 는 Java 객체 jwtauthenticationRequest에 전달됩니다. Rest-Assured는 자동으로 Jackson을 사용하여 객체를 JSON 문자열로 직렬화하는 데 도움이되기 때문입니다. 물론 변환 된 JSON을 신체에 넣을 수도 있습니다. 효과는 동일합니다.
반환 결과는 응답에 의해 잡힌 다음 검증을 위해 JSONPATH를 사용하여 데이터를 얻을 수 있습니다. 물론 또 다른 직관적 인 방법이 있으며, 이는 응답을 통해 완전한 응답을 얻은 다음 검증을 위해 Java 객체로 사라질 수 있습니다.
이 시점에서 가장 기본적인 것은 완료됩니다. Jenkins에 스텝 그레이드 테스트를 추가하면 코드가 제출 될 때마다 테스트를 달성 할 수 있습니다.
복잡한 상황
혼합 데이터
이것은 가장 쉬운 일입니다. 프로젝트에는 많은 개발자가 있으며 각 개발자는 자체 IT 사례를 작성하므로 데이터간에 영향을 미치면 어떻게해야합니까? 이해하기 쉽습니다. 예를 들어, 테스트 배치가 쓴 시나리오에서 최종 확인 방법은 작성된 데이터 양이 10,000 줄인지 확인하는 것입니다. 그런 다음 다른 개발자는 다른 사례를 작성 하고이 테이블에 새 데이터를 추가하여 10W+1 행으로 바뀌 었으므로 배치로 작성된 경우는 탈출 할 수 없습니다.
이 상황을 방지하기 위해 각 테스트 클래스를 사용하여 데이터를 지 웁니다. 클래스 기반 작업이므로 기본 클래스를 작성하여 해결할 수 있습니다.
@runwith (springrunner.class) @springboottest (webenvironment = springboottest.webenvironment.random_port) @ActiveProfiles ({profiles.env_it}) public class baseintegrationtest {private static jdbctemplate jdbctemplate; @autowired public void setDatasource (DataSource DataSource) {jdbctemplate = new jdbctemplate (DataSource); } @Value ( "$ {local.server.port}") 보호 된 int 포트; @public void setupenv () {restassured.port = port; restassured.basepath = "/api"; restassured.baseuri = "http : // localhost"; restassured.config = restassured.config (). httpclient (httpclientConfig.httpclientConfig (). httpmultipartMode (httpmultipartMode.Browser_ComPatible); } public void teardownenv () {stible (). contentType (contentType.json). } @AfterClass public static void cleandb ()는 sqlexception {resource resource = new classPathResource ( "/testData/cleandb.sql"); 연결 연결 = jdbctemplate.getDatasource (). getConnection (); scriptUtils.ExecutesQlScript (연결, 자원); connection.close (); }}@afterclass는 jdbctemplate를 사용하여 cleandb.sql을 실행하여 모든 테스트 데이터를 이러한 방식으로 지 웁니다.
@ Value("${local.server.port}") 도 언급해야합니다. 포트는 무작위이므로 Rest-Assured는 요청이 전송되는 포트를 알지 못합니다. 여기에서 @Value를 사용하여 현재 포트 번호를 가져 와서 Restassured.port로 설정 하여이 문제를 해결하십시오.
공유 데이터를 처리하는 방법
완전히 실행하려면 수십 개의 수업과 수백 가지 방법이 필요할 수 있습니다. 그렇다면 모든 사례에 일부 데이터가 필요하고 모든 경우에만 실행 된 후에 만 지워야한다면 어떨까요? 다시 말해, 이러한 종류의 데이터 청소는 클래스를 기반으로하는 것이 아니라 한 번에 실행됩니다. 예를 들어, 초기 사용자 데이터, 도시 도서관 등
우리는 영리한 속임수를 연주하고 Flyway를 사용했습니다
@configuration@conditionalOnclass ({dataSource.class}) public class upgradeoutoconfiguration {public static final string flyway = "Flyway"; @Bean (name = flyway) @profile ({Env_it}) public upgradevice cleanandupgradeService (dataSource dataSource) {upgradeService upgradeService = new Flyway UpgradeService (DataSource); try {upgradeService.cleanAndUpgrade (); } catch (Exception Ex) {logger.error ( "플라이 웨이 실패!", ex); } return upgradeService; }} 프로필이있을 때 Flyway는 모든 테이블을 떨어 뜨리고 업그레이드 스크립트를 차례로 실행하여 완전히 비어있는 완전한 데이터 테이블을 만듭니다. 프로젝트의 테스트 경로에서 거대한 버전의 SQL을 추가하여 Flyway가 src/test/resources/db/migration/V999.0.1__Insert_Users.sql 과 같은 결국 공통 테스트 데이터를 삽입 할 수 있도록 다양한 데이터 문제를 완벽하게 해결할 수 있습니다.
요약
Spring Boot에서 내장 테스트 서비스를 사용하면 API를 신속하게 확인할 수 있습니다. 서비스를 시작한 다음 수동 페이지를 클릭하여 API를 테스트 할 필요가 없습니다. 프론트 엔드 동료와 직접 통신하여 요청 형식을 작성하고 확인하기 위해 케이스를 작성합니다.
물론,이 방법에는 단점이 있으며, 이는 시스템을 스트레스 테스트하는 것이 불편하다는 것입니다. 이전에는 회사의 API 테스트 사례가 JMeter가 작성했으며 성능 테스트를 수행 할 때 훨씬 편리합니다.