In meiner vergangenen Karriere stellte ich oft fest, dass einige Leute keinen Testcode geschrieben haben, und der Grund, warum sie behaupteten, nicht zu schreiben, war, dass sie nicht leicht Testfälle in mehreren verschiedenen Modulen schreiben konnten. Nun, ich glaube, den meisten von ihnen fehlt entweder etwas einfacher zu meistern technische Mittel oder haben keine Zeit, es herauszufinden. Schließlich wird es immer verschiedene Drucke wie Fortschritte bei der Arbeit geben. Da ich nicht weiß, wie ich testen soll, ignoriere ich oft Integrationstests und die Probleme, die mit sich bringen, sind schlechtere Software, immer mehr Fehler und enttäutigere Kunden. Daher möchte ich einige persönliche Erfahrungen teilen, um das Geheimnis der Integrationstests zu enthüllen.
So integrieren Sie das Testen von Spring-basierte Projekte <BR /> Verwenden von Tools: Spring, Junit, Mockito
Stellen Sie sich vor, es gibt ein solches Frühjahrsprojekt, das einige externe Dienste wie einige Bankwebdienste integriert. Anschließend sind die Probleme beim Schreiben von Testfällen für dieses Projekt und das Abschluss dieser Tests in einem kontinuierlichen Integrationssystem im Grunde genommen gleich:
1. In jedem Test werden Transaktionen vorhanden, und jede Transaktion erfordert Geldkosten, die letztendlich vom Kunden getragen werden.
2. Übermäßige Anfragen, die während der Tests ausgestellt wurden, können als böswillige Anfragen angesehen werden, die dazu führen können, dass das Konto in der Bank mit der Folge des Testversagens blockiert wird.
3. Wenn das Testen unter Verwendung einer Nichtproduktionsumgebung durchgeführt wird, sind die Testergebnisse nicht sehr zuverlässig. In ähnlicher Weise ist die Folge, dass der Test fehlschlägt.
Wenn Sie eine einzelne Klasse testen, ist das Problem normalerweise leicht zu lösen, da Sie einige externe Dienste für den Anruf virtualisieren können. Wenn Sie jedoch den gesamten riesigen Geschäftsprozess testen, müssen Sie mehrere Komponenten testen, und zu diesem Zeitpunkt müssen Sie diese Komponenten für die Verwaltung in den Frühlingscontainer einbeziehen. Glücklicherweise enthält der Frühling ein sehr ausgezeichnetes Test -Framework, mit dem Sie Beans aus Konfigurationsdateien der Produktionsumgebung in die Testumgebung injizieren können. Für diejenigen, die als externe Dienste bezeichnet werden, müssen wir selbst Scheinimplementierungen selbst schreiben. Die erste Reaktion gewöhnlicher Personen kann darin bestehen, die von der Feder während der Setup -Stufe des Tests injizierten Bohnen wiederzugeben (zu ändern), diese Methode muss jedoch sorgfältig berücksichtigt werden.
Warnung: Auf diese Weise bricht Ihr Testcode das eigene Verhalten des Containers, sodass es keine Garantie gibt, dass er die Ergebnisse Ihres Tests in einer realen Umgebung übereinstimmt.
Anstatt die Scheinklasse zuerst implementieren und sie dann in die erforderliche Bohne einzudämmen, können wir uns von Anfang an die Mock -Klasse helfen lassen. Zeigen wir es mit Code.
Das Beispielprojekt enthält eine Klasse namens BankService, die den Aufruf des externen Dienstes darstellt, und eine Klasse namens UserBalancesService, die BankService aufruft. UserBalancesService ist sehr einfach implementiert, um die Konvertierung der Balance von String in Doppeltyp zu vervollständigen.
Quellcode von BankService.java:
public interface banksService {String GetBalanceByemail (String -E -Mail);} Quellcode von BankServiceImpl.java:
public class banksServiceImpl implementiert banksService {@Override public String GetBalanceByEmail (String -E -Mail) {Neue nicht unterstützte OperationException ("Operation fehlgeschlagen aufgrund externer Ausnahme"); }} Quellcode von UserBalancesService.java:
Schnittstelle UserBalancesService {Double getAccountBalance (String -E -Mail);} Quellcode von UserBalancesServiceImpl.java:
Public Class UserBalancesServiceImpl implementiert UserBalancesService {@autowired Private BankService BankService; @Override public double getAccountBalance (String -E -Mail) {double.ValueOf (banksService.getBalanceByemail (E -Mail)); }} Dann gibt es die XML -Konfigurationsdatei von Spring und fügen die erforderliche Bean -Deklaration hinzu.
Quellcode von ApplicationContext.xml:
<? XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
Hier ist der Quellcode der Testklassen -BenutzerbalanceServiceImPltest.java:
@Runwith (SpringJunit4ClASSRunner.class) @ContextConfiguration (SOPITATIONS = "CLASSPATH: /springtest/springockito/ApplicationContext.xml") Public Class UserBalancesInRiceImplProfiletest {@autowired private usebalancesVice usbalancesInervice; @Autowired Private Banksservice BankService; @Test public void shilturnMockedBalance () {Double Balance = UserBalancesService.getAccountBalance ("[email protected]"); assertequals (balance, double.Valueof (123,45d)); }} Wie wir erwartet hatten, meldet die Testmethode eine nicht unterstützte Ausnahme von OperationException. Unser aktueller Zweck ist es, BankService durch unsere Simulationsimplementierung zu ersetzen. Es ist in Ordnung, Mockito direkt zu verwenden, um Fabrikbohnen zu erzeugen, aber es gibt eine bessere Option. Verwenden Sie das Springockito -Framework. Sie können eine grobe Idee haben, bevor Sie fortfahren.
Die verbleibende Frage ist einfach: Wie man Spring in eine simulierte Bohne anstelle einer realen Bean injiziert, gab es keinen anderen Weg vor Frühjahr 3.1, außer um eine neue XML -Konfigurationsdatei zu erstellen. Da Spring jedoch die Profildefinition von Beans einführte, haben wir eine elegantere Lösung, obwohl dieser Ansatz auch eine zusätzliche XML -Konfigurationsdatei speziell für das Testen erfordert. Hier ist der Code für die Konfigurationsdatei testApplicationContext.xml zum Testen:
<? xmlns: mockito = "http://www.mockito.org/spring/mockito" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/ http://www.mockito.org/spring/mockito https://bitbucket.org/kubek2k/springockito/raw/tip/springockito/src/main/resources/spring/mockito.xsd "> < ressourcen = "classPath: /springtest/springockito/applicationcontext.xml"/> <beans profile = "Springest"> <Mockito: Mock ID = "Banksservice"/> </beans> </beans>
Der Quellcode der Testklassen -BenutzerbalanceServiceImPlprofiletest.java nach entsprechenden Änderungen:
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:/springtest/springockito/testApplicationContext.xml")@ActiveProfiles(profiles = {"springTest"})public class UserBalanceServiceImplProfileTest { @Autowired private UserBalanceService userBalanceService; @Autowired Private Banksservice BankService; @Before public void setup () löst Ausnahme aus {mockito.when (banksService.getBalanceByemail ("[email protected]")). Threeturn (String.ValueOf (123.45d)); } @Test public void shilturnMockedBalance () {double balance = userBalancesVice.getAccountBalance ("[email protected]"); assertequals (balance, double.Valueof (123,45d)); }} Möglicherweise haben Sie festgestellt, dass wir in der Setup -Methode das simulierte Verhalten definieren und die @Profile -Annotation zur Klasse hinzufügen. Diese Annotation aktiviert ein Profil namens Springest, sodass die mit Springockito simulierte Bean überall dort automatisch injiziert werden kann. Das Run -Ergebnis dieses Tests wird erfolgreich sein, da Spring die von Springockito simulierte Version injiziert und nicht die in ApplicationContext.xml deklarierte Version.
Optimieren Sie unsere Tests fort
Wenn wir die Lösung für dieses Problem weiter übernehmen können, scheint dieser Artikel nicht fehlerhaft zu sein. Springockito bietet einen anderen Namen namens namens
Springockito Annotation Framework, mit dem wir Annotationen in Testklassen verwenden können, um Scheinklassen zu injizieren. Bevor Sie weiter lesen, ist es besser, auf die Website zu gehen, um einen Blick darauf zu werfen. OK, hier ist der geänderte Testcode.
Source code of UserBalanceServiceImplAnnotationTest.java: @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = "classpath:/springtest/springockito/applicationContext.xml")public class UserBalanceServiceImplAnnotationTest { @Autowired Private UserBalancesVice UserBalancesService; @Autowired @ReplaceWithmock Private BankService BankService; @Before public void setup () löst Ausnahme aus {mockito.when (banksService.getBalanceByemail ("[email protected]")). Threeturn (string.ValueOf (valueOf (123.45d))); } @Test public void shilturnMockedBalance () {Double Balance = UserBalancesService.getAccountBalance ("[email protected]"); Assertequals (Saldo, Wert (123,45D)); }} Bitte beachten Sie, dass hier keine neu eingeführte XML -Konfigurationsdatei vorliegt, aber die applicationContext.xml der formalen Umgebung wird direkt verwendet. Wir verwenden die @ReplaceWithmock -Annotation, um die Bean von Typ BankService zu markieren und dann das Verhalten der Scheinklasse in der Setup -Methode zu definieren.
PostScript
Das Springockito-Annotations-Projekt hat einen enormen Vorteil, dh unseren Testcode für die Abhängigkeitsabdeckung erstellt, sodass wir keine zusätzlichen XML-Konfigurationsdateien definieren oder die Konfigurationsdateien der Produktionsumgebung für das Testen ändern müssen. Wenn Sprungockito-Annotationen nicht verwendet werden, haben wir keine andere Wahl, als zusätzliche XML-Konfigurationsdateien zu definieren. Daher empfehle ich dringend, Springockito-Annotationen in Ihren Integrationstests zu verwenden, damit Sie die Auswirkungen Ihrer Testfälle auf Ihren Produktionscode minimieren und die Belastung für die Aufrechterhaltung zusätzlicher XML-Konfigurationsdateien entfernen können.
PostScript
Das Schreiben von Integrationstests für Frühlingsprojekte ist wirklich viel einfacher. Der Code im Artikel bezieht sich auf meinen eigenen GitHub.
Übersetzungslink: http://www.codeceo.com/article/spring-test-is-easy.html
Original Englisch: Testen Sie mich, wenn Sie Nr. 1 können (Feder -Framework)
Übersetzer: Sandbox Wang, Codierungsnetzwerk
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.