Vert.x 자바 개발 가이드-제5 장 테스트 Vert.x 코드

제5 장 테스트 Vert.x 코드
저작권 성명:본 고 는 블 로 거들 이 자발적으로 번역 하고 전재 할 때 출처 를 표시 해 주 십시오.https://blog.csdn.net/elinespace/article/details/80470846
해당 코드 는 이 안내 창고 의 step-4 디 렉 터 리 에 있 습 니 다.
지금까지 우 리 는 테스트 가 포함 되 지 않 은 위 키 를 개발 했다.이것 은 당연히 좋 은 실천 이 아니 므 로 Vert.x 코드 를 위 한 테스트 를 어떻게 작성 하 는 지 살 펴 보 자.
5.1 시작
vertx-unit 모듈 은 Vert.x 의 비동기 동작 을 테스트 하 는 도 구 를 제공 합 니 다.이외에 도 JUnit 과 같은 테스트 프레임 워 크 를 사용 할 수 있 습 니 다.
JUnit 을 사용 하여 필요 한 Maven 의존 도 는 다음 과 같 습 니 다.
<dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.12version>
    <scope>testscope>
dependency>
<dependency>
    <groupId>io.vertxgroupId>
    <artifactId>vertx-unitartifactId>
    <scope>testscope>
dependency>

JUnit 테스트 는 vertx-unit 특성 을 사용 할 수 있 도록 VertxUnitRunner runner 로 주석 을 달 아야 합 니 다.
@RunWith(VertxUnitRunner.class)
public class SomeTest {
    // (...)
}

이 runner,JUnit 테스트 와 라 이 프 사이클 방법 을 통 해 TestContext 인 자 를 받 습 니 다.이 대상 은 기본 적 인 단언,데이터 컨 텍스트 를 저장 하 는 접근,그리고 비동기 적 인 도움말 류 를 제공 합 니 다.우 리 는 이 절 에서 볼 수 있 습 니 다.
그것 을 설명 하기 위해 서 우 리 는 비동기 장면 을 고려 합 니 다.우 리 는 timer 작업 이 한 번 호출 되 었 고 한 주기 작업 이 세 번 호출 되 었 는 지 확인 하고 싶 습 니 다.이 코드 는 비동기 이기 때문에 테스트 방법 은 테스트 가 완료 되 기 전에 종료 합 니 다.따라서 테스트 가 통과 되 거나 실패 할 경우 비동기 방식 으로 진행 해 야 합 니 다.
@Test /*(timeout=5000)*/public void async_behavior(TestContext context) { ①
    Vertx vertx = Vertx.vertx(); ②
    context.assertEquals("foo", "foo"); ③
    Async a1 = context.async(); ④
    Async a2 = context.async(3); ⑤
    vertx.setTimer(100, n -> a1.complete()); ⑥
    vertx.setPeriodic(100, n -> a2.countDown()); ⑦
}

① TestContext 는 runner 가 제공 하 는 매개 변수 이다.
② 유닛 테스트 에서 Vert.x 컨 텍스트 를 만들어 야 합 니 다.
③ 여 기 는 기본 적 인 Test Context 단언 의 예 입 니 다.
④ 우 리 는 첫 번 째 Async 대상 을 얻 었 고 그 다음 에 완성(또는 실패)할 수 있 습 니 다.
⑤ 이 Async 대상 은 countdown 작업 으로 세 번 호출 한 후에 성공 적 으로 완성 된다.
⑥ 우 리 는 timer 가 촉발 할 때 완성 합 니 다.
⑦ 주기 퀘 스 트 마다 countdown 을 터치 합 니 다.테스트 는 모든 Async 대상 이 완 료 된 후에 통과 합 니 다.
⑨ 기본(long)시간 초과 가 비동기 테스트 사례 에 사용 되 지만 JUnit 의@Test 주 해 를 통 해 덮어 쓸 수 있 습 니 다.
5.2 테스트 데이터베이스 조작
데이터베이스 서 비 스 는 테스트 를 작성 하기에 매우 적합 하 다.
우 리 는 우선 데이터베이스 Verticle 을 배치 해 야 한다.저 희 는 JDBC 링크 를 HSQLDB 로 설정 하고 메모리 저장 소 를 사용 할 것 입 니 다.성공 할 때 저 희 는 테스트 사례 에 사용 할 서비스 대 리 를 가 져 올 것 입 니 다.
이러한 작업 의 필요 로 인해 저 희 는 JUnit 의 before/after 수명 주기 방법 을 이용 합 니 다.
private Vertx vertx;
private WikiDatabaseService service;
@Before
public void prepare(TestContext context) throws InterruptedException {
    vertx = Vertx.vertx();
    JsonObject conf = new JsonObject() ①
        .put(WikiDatabaseVerticle.CONFIG_WIKIDB_JDBC_URL,               "jdbc:hsqldb:mem:testdb;shutdown=true")
        .put(WikiDatabaseVerticle.CONFIG_WIKIDB_JDBC_MAX_POOL_SIZE, 4);
    vertx.deployVerticle(new WikiDatabaseVerticle(), new DeploymentOptions().setConfig(conf),
    context.asyncAssertSuccess(id -> ②
        service = WikiDatabaseService.createProxy(vertx,WikiDatabaseVerticle.CONFIG_WIKIDB_QUEUE)));
}

① 저 희 는 Verticle 의 일부 설정 만 복사 하고 기본 값 을 사용 합 니 다.
② async AssertSuccess 는 비동기 작업 의 성공 을 감지 하 는 handler 를 제공 하 는 데 매우 유용 하 다.그것 은 하나의 변 체 는 인삼 이 없 는 것 이 고,다른 변 체 는 이것 과 같 습 니 다.이때 우 리 는 결 과 를 다른 handler 로 연결 할 수 있 습 니 다.
Vert.x 의 청 소 는 매우 간단 합 니 다.우 리 는 다시 asyncAssertSuccess 를 사용 하여 오류 가 발생 하지 않도록 합 니 다.
@After
public void finish(TestContext context) {
    vertx.close(context.asyncAssertSuccess());
}

데이터베이스 서비스의 조작 은 본질 적 으로 CRUD 작업 이기 때문에 하나의 JUnit 테스트 용례 를 사용 하여 그것들 을 합병 하 는 것 은 모두 테스트 의 좋 은 방법 이다.
@Test
public void crud_operations(TestContext context) {
    Async async = context.async();
    service.createPage("Test","Some content",context.asyncAssertSuccess(v1 -> {
        service.fetchPage("Test",context.asyncAssertSuccess(json1 -> {
            context.assertTrue(json1.getBoolean("found"));
            context.assertTrue(json1.containsKey("id"));
            context.assertEquals("Some content",json1.getString("rawContent"));
            service.savePage(json1.getInteger("id"),"Yo!",context.asyncAssertSuccess(v2 -> {
                service.fetchAllPages(context.asyncAssertSuccess(array1 -> {
                    context.assertEquals(1,array1.size());
                    service.fetchPage("Test",context.asyncAssertSuccess(json2 -> {
                        context.assertEquals("Yo!",json2.getString("rawContent"));
                        service.deletePage(json1.getInteger("id"),v3 -> {
                            service.fetchAllPages(context.asyncAssertSuccess(array2 -> {
                                context.assertTrue(array2.isEmpty());
                                async.complete();①
                                }));
                            });
                        }));
                    }));
                }));
            }));
        }));
    async.awaitSuccess(5000);②
}

① 이것 은 유일한 Async 가 최종 적 으로 완성 한 곳 이다.
② 테스트 용례 를 종료 하 는 방법 과 JUnit 에 의존 하 는 시간 초과 사이 의 취사선택 입 니 다.Async 가 완료 되 거나 시간 초과 주기 가 지나 갈 때 까지 테스트 사례 스 레 드 를 실행 합 니 다.

좋은 웹페이지 즐겨찾기