과거의 경력에서 나는 종종 일부 사람들이 테스트 코드를 작성하지 않았다는 것을 알았으며, 그들이 쓰지 않겠다고 주장한 이유는 여러 다른 모듈을 다루는 테스트 케이스를 쉽게 쓸 수 없기 때문입니다. 글쎄, 나는 그들 대부분이 더 쉽게 마스터하기 쉬운 기술 수단이 없거나 그것을 알아낼 시간이 없다고 생각합니다. 결국, 직장 진행과 같은 다양한 압력이 항상있을 것입니다. 테스트 방법을 모르기 때문에 종종 통합 테스트를 무시하고 문제가 발생하면 소프트웨어가 악화되고 점점 더 많은 버그 및 더 실망한 고객이 있습니다. 그래서 저는 통합 테스트의 미스터리를 공개하기 위해 개인적인 경험을 공유하고 싶습니다.
스프링 기반 프로젝트 테스트를 더 잘 통합하는 방법 <BR /> 도구 사용 : Spring, Junit, Mockito
일부 뱅킹 웹 서비스와 같은 외부 서비스를 통합하는 봄 프로젝트가 있다고 상상해보십시오. 그런 다음이 프로젝트의 테스트 사례를 작성하고 지속적인 통합 시스템에서 이러한 테스트를 완료 할 때 발생하는 문제는 기본적으로 동일합니다.
1. 각 테스트에 거래가있을 것이며 각 거래에는 금전적 비용이 필요하며 궁극적으로 고객이 부담합니다.
2. 테스트 중에 발행 된 과도한 요청은 악의적 인 요청으로 간주 될 수 있으며, 이로 인해 은행의 계정이 차단 될 수 있으며 테스트 실패의 결과로 인해 차단 될 수 있습니다.
3. 비 생산 환경을 사용하여 테스트를 수행 할 때 테스트 결과는 그다지 신뢰할 수 없습니다. 마찬가지로, 결과는 테스트가 실패한 것입니다.
일반적으로 단일 클래스를 테스트 할 때는 호출을 위해 외부 서비스를 가상화 할 수 있기 때문에 문제를 쉽게 해결할 수 있습니다. 그러나 전체 거대한 비즈니스 프로세스를 테스트 할 때는 여러 구성 요소를 테스트해야하며 현재이 구성 요소를 관리를 위해 스프링 컨테이너에 통합해야합니다. 다행스럽게도 Spring에는 생산 환경 구성 파일에서 Bean을 테스트 환경에 주입 할 수있는 매우 뛰어난 테스트 프레임 워크가 포함되어 있지만 외부 서비스라고하는 경우 모의 구현을 직접 작성해야합니다. 평범한 사람들의 첫 번째 반응은 테스트의 설정 단계에서 스프링에 의해 주입 된 콩을 다시 주입 (수정) 할 수 있지만,이 방법은 신중하게 고려해야합니다.
경고 : 이런 식으로, 테스트 코드는 컨테이너의 자체 동작을 중단하므로 실제 환경에서 테스트 결과와 동일 할 것이라는 보장은 없습니다.
실제로, 먼저 모의 클래스를 구현 한 다음 필요한 콩으로 다시주는 대신, 우리는 스프링이 처음부터 모의 클래스를 주입하는 데 도움이되도록 할 수 있습니다. 코드로 시연합시다.
샘플 프로젝트에는 외부 서비스에 대한 호출을 나타내는 Bankservice라는 클래스와 Bankservice라고하는 UserBalanceservice라는 클래스가 포함되어 있습니다. userBalancesVice는 문자열에서 이중 유형으로 균형 변환을 완료하기 위해 매우 간단합니다.
Bankservice.java의 소스 코드 :
public interface bankservice {String getBalanceByemail (문자열 이메일);} Bankserviceimpl.java의 소스 코드 :
공개 클래스 BankserviceImpl은 Bankservice를 구현합니다. {@override public string getBalanceByemail (문자열 이메일) {새로운 UnsupportedOperationException ( "외부 예외로 인해 작동 실패"); }} userBalanceservice.java의 소스 코드 :
인터페이스 userBalancesVice {double getAccountBalance (문자열 이메일);} userbalanceserviceimpl.java의 소스 코드 :
공개 클래스 userbalanceserviceimpl은 userbalanceservice {@autowired private bankservice bankservice를 구현합니다. @override public double getAccountBalance (문자열 이메일) {return double.valueof (bankservice.getBalanceEmail (이메일)); }} 그런 다음 Spring의 XML 구성 파일이있어 필요한 Bean 선언이 추가됩니다.
소스 Code of ApplicationContext.xml :
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beansd"> <bean id = "bankservice"/> <one id = "userbalancess"/</bean>
다음은 테스트 클래스 userBalancesERVICEIMPLTEST.java의 소스 코드입니다.
@runwith (springJunit4classRunner.class) @ContextConfiguration (locations = "classPath : /springtest/springockito/ApplicationContext.xml") 공개 클래스 userBalancesErviceImprofileTest {@autowired private userBalances userViceService; @autowired Private Bankservice Bankservice; @test public void hoomberturnmockedbalance () {double balance = userbalanceservice.getAccountBalance ( "[email protected]"); AsserTequals (Balance, Double.Valueof (123.45d)); }} 예상 한 바와 같이, 테스트 방법은 지원되지 않은 외과 예외를보고합니다. 현재 목적은 Bankservice를 시뮬레이션 구현으로 대체하는 것입니다. Mockito를 직접 사용하여 공장 콩을 생성해도 괜찮지 만 더 나은 옵션이 있습니다. Springockito 프레임 워크를 사용하십시오. 계속하기 전에 거친 아이디어를 가질 수 있습니다.
나머지 질문은 간단합니다. 실제 콩 대신 시뮬레이션 된 콩에 스프링을 주입하는 방법, 새 XML 구성 파일을 만드는 것 외에는 스프링 3.1 이전에는 다른 방법이 없었습니다. 그러나 Spring은 Bean의 프로파일 정의를 도입 한 이후보다 우아한 솔루션을 가지고 있지만,이 방법에는 테스트를 위해 특별히 추가 XML 구성 파일이 필요합니다. 다음은 테스트하는 데 사용되는 구성 파일 TestApplicationContext.xml 코드입니다.
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : mockito = "http://www.mockito.org/spring/mockito"xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/schema/spr) http://www.mockito.org/spring/mockito https://bitbucket.org/kubek2k/springockito/tip/springockito/src/main/resources/spring/mockito.xsd "> resource = "classpath : /springtest/springockito/applicationcontext.xml"/> <beans profile = "springtest"> <mockito : mock id = "bankservice"/</beans> </beans>
테스트 클래스의 소스 코드 userBalanceserViceimplProfileTest.java 해당 수정 후 :
@runwith (springJunit4classRunner.class) @ContextConfiguration (locations = "classPath : /springtest/springockito/TestApplicationContext.xml")@ActiveProfiles (profiles = { "SpringTest"}) { "springtest"}) @autowired Private Bankservice Bankservice; @public void setup ()은 예외를 {mockito.when (bankservice.getBalanceByemail ( "[email protected]")). } @test public void ruthreturnMockedBalance () {double balance = userbalanceservice.getAccountBalance ( "[email protected]"); AsserTequals (Balance, Double.Valueof (123.45d)); }} 설정 방법에서 시뮬레이션 된 동작을 정의하고 클래스에 @profile 주석을 추가한다는 것을 알 수 있습니다. 이 주석은 SpringTest라는 프로파일을 활성화하므로 Springockito를 사용하여 시뮬레이션 된 Bean은 필요한 곳 어디에서나 자동으로 주입 할 수 있습니다. Spring은 ApplicationContext.xml에 선언 된 버전이 아니라 Springockito가 시뮬레이션 한 버전을 주입하기 때문에이 테스트의 실행 결과가 성공적입니다.
테스트를 계속 최적화하십시오
우리 가이 문제에 대한 해결책을 더 많이 가져갈 수 있다면,이 기사는 결함이없는 것 같습니다. Springockito는 다른 이름이라는 이름을 제공합니다
Springockito 주석 프레임 워크를 통해 테스트 클래스에서 주석을 사용하여 모의 클래스를 주입 할 수 있습니다. 계속 읽기 전에 웹 사이트로 이동하여 살펴 보는 것이 좋습니다. 자, 수정 된 테스트 코드는 다음과 같습니다.
userbalanceserviceimplannottest.java의 소스 코드 : @runwith (springjunit4classrunner.class) @contextConfiguration (loader = springockitocontextloader.class, locations = "classpath : /springtest/springockito/applicationcontext.xountest veroplanceimplonteTest. 개인 userBalancesErvice userBalanceservice; @autowired @replacewithmock Private Bankservice Bankservice; @public void setup ()은 예외 {mockito.when (bankservice.getBalanceByemail ( "[email protected]")). } @test public void ruthreturnMockedBalance () {double balance = userbalanceservice.getAccountBalance ( "[email protected]"); Assertequals (균형, 가치의 가치 (123.45d)); }} 여기에는 새로 도입 된 XML 구성 파일이 없지만 공식 환경의 ApplicationContext.xml이 직접 사용됩니다. @replaceWithMock 주석을 사용하여 BankService 유형의 Bean을 표시 한 다음 설정 방법에서 모의 클래스의 동작을 정의합니다.
추신
Springockito-Annotations 프로젝트는 종속성 커버리지에 대한 테스트 코드를 구축하므로 추가 XML 구성 파일을 정의하거나 테스트를 위해 프로덕션 환경의 구성 파일을 수정할 필요가 없습니다. Springockito-Nantations가 사용되지 않으면 추가 XML 구성 파일을 정의 할 수밖에 없습니다. 따라서 통합 테스트에서 Springockito-Nantations를 사용하여 프로덕션 코드에 대한 테스트 사례의 영향을 최소화하고 추가 XML 구성 파일을 유지 관리하는 부담을 제거하는 것이 좋습니다.
추신
봄 프로젝트에 대한 통합 테스트 작성은 훨씬 쉽습니다. 기사의 코드는 내 자신의 github를 나타냅니다.
번역 링크 : http://www.codeceo.com/article/spring-test-is-easy.html
원래 영어 : #1 (스프링 프레임 워크)이 가능한 경우 테스트하십시오.
번역기 : 샌드 박스 왕, 코딩 네트워크
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.