2016-12-19 7 views
0

서버/클라이언트 프로그램에 타사 라이브러리를 사용하고 있습니다. 서버/클라이언트는 특정 데이터 모델을 등록 할 수 있습니다 (세부 사항은 여기서는 중요하지 않습니다). 내 단위 테스트에서JUnit에서 싱글 톤을 "단절"하는 방법은 무엇입니까?

, 나는이 대략 다음

private static MyServerType myServer; // my class, derived from a 3rd party class 
private static MyClientType myClient; // my class, derived from 3rd party 
private static int modelId = 123;  // identifier to identify the data model 

@BeforeClass 
public static void setUpBeforeClass() throws Exception { 
    int modelId 
    myServer = new MyServerType(); 
    myServer.registerDataModel(modelId, new ServerDataModel()); 
    myClient = new MyClientType(); 
    myClient.registerDataModel(modelId, new ClientDataModel()); 

} 

이 코드를 실행하면 실패 - 내부 (우리는 소스 코드를 볼 수 있음) 때문에, 라이브러리가 싱글있다 Id에 의해 모델을 등록하는 정적 클래스 (.getInstance())를 찾고이 Id가 등록 된 모델이 이미 있음을 확인합니다.

클라이언트/서버 상호 작용을 테스트 할 단위 테스트를 어떻게 실행할 수 있습니까? (서버와 클라이언트는 모두 제 3 자 라이브러리 클래스에서 파생 된 자체 프로그램이므로이 둘 모두와 그 상호 작용을 테스트해야합니다.)

@BeforeClass 메서드에서 나는 갓 컴파일 된 섬기는 사람. 이것은 어떻게 든 꽤 못생긴 것 같습니다.

하나의 프로세스에 대해 유닛 테스트 (예 : JVM의 "가상 머신"과 같은)에서 서버 또는 클라이언트를 "격리"하여 getInstance()가 서버 및 클라이언트에 대해 다른 객체를 반환하도록하는 방법이 있습니까? 그룹화 된 스레드/스레드 그룹 또는 이와 유사한?

ps : 예, 이것은 싱글 톤이 악한 이유의 예입니다.하지만 함께 살아야합니다.

EDIT : 비즈니스 논리를 서버 논리에서 분리하여 비즈니스 논리를 독립적으로 테스트 할 수 있습니다. 제가 테스트하고자하는 것은 서버가 비즈니스 로직을위한 적절한 프론트 엔드로 작동한다는 것입니다. 즉, 모든 데이터 변경 사항을 업데이트하고 사용자 요청에 대한 비즈니스 로직에 대한 함수 호출을 트리거합니다.

단위 테스트 (예 : 통합 테스트)에서 이러한 종류의 테스트가 "너무 큽니까"입니까?

특히 : 단순한 클라이언트, 즉 프로토콜을 사용하는 스텁 클라이언트를 사용하는 경우 서버가 올바른 데이터 등을 제공하는지 테스트해야합니다. 그런 테스트 (예 : @Test public void test_publishes_updates_on_VARIABLEX() { ... }@Test public void test_calls_backend_functionY_and_returns_formatted_reply() { ... })는 단위 테스트입니까?

답변

0

이상적으로 어떻게 작동하는지 예상하기 전에 제 응답은 다음과 같을 것입니다. 클라이언트 코드와 서버 코드를 서로 고립시켜 테스트 해보려고합니다. 아마도이 프레임 워크에는 클라이언트에서 서버로, 그리고 그 반대로도 통신하는 데 사용하는 메커니즘이있을 것입니다. 프레임 워크가 제공하는 인터페이스 또는 수퍼 클래스 메소드를 통해 서로 이야기 할 수 있을까요? 나는 이것들을 스텁 (stub) 할 것이다. 인터페이스가 쉬운 경우, 수퍼 클래스 메소드라면 약간의 래퍼 작업을 수행해야한다. 그런 다음 클라이언트 클래스에 특정 기능을 사용할 때 - 예를 들어 클라이언트를 확인한다. 올바른 방법으로 서버와 통신 할 수 있습니다. 이 둘 사이의 통신이 이미 인터페이스에 의해 처리되지 않은 경우이를 괴롭히는 방법에 대한 팁을 제공하려면 - 사용중인 라이브러리를 볼 필요가 있습니다.

JVM 내부에서 서로 상호 작용하는 클라이언트와 서버가있는 곳에서 이상적으로 작동시키는 방법에 대해 알아 보겠습니다. 프레임 워크가 분명히 이들이 동일한 프로세스에 있지 않을 것으로 기대하기 때문에 가능한지 확신 할 수 없습니다. 따라서 ID의 고유성.유닛 테스트와는 별도의 프로세스에서 클라이언트와 서버를 모두 시작해야하는 것처럼 보일 것입니다. 단위 테스트가 아닌 통합 테스트와 같아집니다. 그리고 서버 프로세스가 응답으로 올바른 작업을 수행하는지 확인하는 방법 서버 측 코드 (데이터베이스와의 상호 작용 등)의 영향을 관찰 할 수 없으면 클라이언트 측 상호 작용이 어려워집니다.

+0

그럼 실제로 이것이 통합 테스트라고 제안 하시겠습니까? (나는 더 정확한 질문을 던졌습니다.) – Moritz

+0

예 - 두 개의 매우 다른 코드 단위의 상호 작용을 테스트하려는 경우 - 통합 테스트가 더 필요합니다. 앞에서 설명한 내용을 통해 일부 사람들은 실제로 샌드 박스에 클라이언트와 서버를 배포하고 클라이언트와 상호 작용 한 다음 수행해야하는 서버 작업을 * 결과 * 확인하여 테스트 할 수 있다고 생각합니다. 이 시나리오에서 진정한 단위 테스트는 클라이언트 또는 서버를 서로 독립적으로 테스트하는 것입니다. 내 서버가이 신호를 수신하면 (실제 클라이언트가 실행될 필요가 없음) - x를 수행해야합니다. 그것은 단위 테스트 일 것입니다. –

관련 문제