Holen Sie sich die neuesten wichtigen Update-Informationen für die Log4j-Sicherheitslücke. Sehen Sie sich an, wie Sie das Problem mithilfe der Parasoft-Anleitung beheben können. Erfahren Sie mehr >>

X
BLOG

Fangen Sie an, Frühlingstests mit dem Unit Test Assistant für Java zu lieben

Fangen Sie an, Frühlingstests mit dem Unit Test Assistant für Java zu lieben Lesezeit: 7 Minuten
Spring ist das führende Java-Anwendungsframework für Unternehmen und erfordert daher ein angemessenes Testniveau, um die Qualität und Sicherheit der damit erstellten Anwendungen zu gewährleisten.

Die Frühling Rahmen (zusammen mit Frühlingsstiefel) ist eines der am beliebtesten Java Enterprise Software Frameworks. Aufgrund seiner Verwendung in geschäftskritischen Anwendungen wurde die Qualität und Sicherheit überprüft.

Zuvor hat unser VP of Products Mark Lambert darüber gesprochen, dass Entwickler Unit-Tests trotz seiner nachgewiesenen Erfolgsbilanz nicht mögen, und detailliert beschrieben, wie Parasoft Jtest ist Unit-Test-Assistent kann einen geführten und automatisierten Testansatz bieten, um das Testen nicht nur angenehmer, sondern auch einfacher und effizienter zu gestalten. In diesem Beitrag werde ich das gleiche Thema mit dem Spring-Framework fortsetzen und es Ihnen zeigen Unit-Test-Beispiele und wie automatisierte und geführte Tests in diesem wichtigen Anwendungsframework genutzt werden können.

Die Herausforderungen beim Testen von Federanwendungen

Das Spring Framework kommt mit netter Unterstützung für IntegrationstestsEs ist jedoch viel manuelle Codierung erforderlich, um Testfälle ordnungsgemäß einzurichten. Das Erstellen und Verwalten von Tests für Spring-Anwendungen stellt Entwickler vor einzigartige Herausforderungen, darunter die folgenden:

  • Das Spring-Framework muss initialisiert und konfiguriert werden
  • Die Anwendung hat normalerweise 3rd-parteibibliotheksabhängigkeiten (persistenter Speicher, externe Dienste usw.)
  • Anwendungen verwenden häufig integrierte Spring-Funktionen für Sitzungen, Sicherheit, Messaging usw. Diese können für Entwickler, die mit Spring-Tests noch nicht vertraut sind, schwierig einzurichten sein
  • Anwendungsabhängigkeiten (dh Beans) müssen entsprechend konfiguriert werden

Diese Herausforderungen führen zusammen mit der Tatsache, dass das Schreiben umfassender und wartbarer Testsuiten im Allgemeinen viel Zeit in Anspruch nimmt, dazu, dass Entwickler nicht genügend Tests schreiben. Dies führt wiederum zu Sicherheitslücken, Fehlern, Regressionen und vielen Kopfschmerzen.

Der Parasoft Jtest Unit Test Assistant hilft dabei, das Generieren, Verbessern und Verwalten von JUnit-Tests viel einfacher und weniger zeitaufwendig zu gestalten, sodass Entwickler schnell gute Tests erstellen und zu dem zurückkehren können, was sie vermutlich lieben - das Schreiben von Code.

Beschleunigen Sie den Komponententest von Federanwendungen mit Parasoft Jtest und seinem Unit Test Assistant

Das Spring MVC Test Framework

Das Spring Framework enthält ein Testframework, das das Testen von Controllern, Diensten und anderen Komponenten erheblich vereinfacht. Es enthält Funktionen zum Konfigurieren des Spring-Testcontainers, zum Aufrufen von Controller-Handler-Methoden und zum Überprüfen des Verhaltens mit benutzerdefinierten Zusicherungen.

Ein Beispiel für einen Spring MVC Controller:

@Controller
public class TodoController {     @Autowired
    private TodoService service;
    @GetMapping("/")    public String findAll(Model model) {
        List<Todo> todos = service.findAll();
        model.addAttribute("todos", todos);
        return "todo/list";
    }
}

Dieser Beispielcontroller implementiert einen einfachen REST-Service, um Elemente aus einer Aufgabenliste abzurufen. Es kommt auf a an TodoService, die die Geschäftslogik enthält.

Zum testen finde alle Methode benötigen wir einen JUnit-Test, der Folgendes ausführt:

  • Konfigurieren Sie den Spring-Container mit dem zu testenden Controller und einem TodoService, von dem TodoController abhängt.
  • Senden Sie eine gültige Anforderung an die findAll-Handlermethode.
  • Überprüfen Sie Elemente der Antwort, einschließlich des Rückgabewerts ("todo / list") und des Modellattributs "todos".

Ein Beispiel für einen Spring MVC Junit-Test könnte folgendermaßen aussehen:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TodoControllerTest {
    @Autowired
    TodoController controller;
 
    @Autowired
    TodoService todoService;
 
    MockMvc mockMvc;
 
    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }
 
    @Configuration
    static class Config {
        @Bean
        public TodoController getTodoController() {
            return new TodoController();
        }
 
        @Bean
        public TodoService getTodoService() {
            return new TodoService();
        }
    }
 
    @Test
    public void testFindAll() throws Exception {
        mockMvc.perform(get("/")).andExpect(view().name("todo/list"));
    }
}

Das obige Beispiel ist a sehr einfacher Test - aber es gibt noch viel „Boiler-Plate“ -Code zu schreiben, und es ist viel los. In diesem Beispiel haben wir Spring mit einem Controller und seinen Diensten unter Verwendung einer inneren Konfigurationsklasse konfiguriert. Wir benutzen dann die MockMvc Funktionen zum Senden einer Anforderung an die Handler-Methode (mit ausführen) und überprüfen Sie den zurückgegebenen Ansichtsnamen mit und erwarten.

Was ist los mit dem obigen Test? Eigentlich nichts - aber stellen Sie sich eine komplexere Controller-Methode mit mehreren Handler-Methoden vor, die mehr Argumente akzeptieren und mehr Ausgaben erzeugen. Das Schreiben der Tests würde viel mehr Zeit in Anspruch nehmen, insbesondere wenn eine gute Testabdeckung wichtig ist. Darüber hinaus erfordern die meisten realen Tests erheblich mehr Konfiguration (XML- oder Klassenkonfigurationen, Sitzungen und Umgebungen, Sicherheit usw.).

Generieren von Frühlingstests mit Parasoft Jtest

Parasoft Jtest's Unit-Test-Assistent hilft Entwicklern beim Schreiben von Frühlingstests auf verschiedene Weise:

  1. Automatische Generierung des Kesselplattencodes für Spring MVC-Tests schnell
  2. Automatische Generierung parametrisierter Tests für eine erhöhte Testabdeckung
  3. Verspotten von Abhängigkeiten, um die Hilfsmethode zu isolieren und den Test zu vereinfachen
  4. Sammeln von Abdeckungsdaten und Analysieren des Testflusses zur Laufzeit
  5. Bereitstellung von Empfehlungen mit Schnellkorrekturen zur Verbesserung der Tests

Automatisch generierende Tests

Das Generieren von Spring-Tests in Parasoft Jtest ist unkompliziert. Wählen Sie einfach eine Spring-Handler-Methode in Ihrer IDE für Ihren Controller aus und wählen Sie eine Aktion zum Erstellen von Tests aus:

Wählen Sie entweder Regelmäßiger Frühling or Parametrierte Feder Erzeugt automatisch den Kesselplatten-Feder-MVC-Test für Sie, einschließlich der Konfigurationsklassen (und aller Bohnen, von denen Ihre Steuerung abhängt). Das mockMvc.perform Anruf wird auch hinzugefügt, und ist vorkonfiguriert, um die Handler-Methode aufzurufen, für die der Test erstellt wurde. Der Jtest Unit Test Assistant Es werden sogar einige Beispielzusicherungen hinzugefügt, die Sie auskommentieren und konfigurieren können.

Parasoft Jtest unterstützt die Testgenerierung mithilfe der XML- oder Klassenkonfiguration, indem in den Einstellungen die Option "ContextConfiguration-Attribute für Spring-Tests" festgelegt wird.

Abhängigkeiten verspotten

Das Verwalten von Abhängigkeiten beim Testen von Einheiten ist von entscheidender Bedeutung, da ein Großteil der Komplexität und Arbeit aus der Isolierung einer zu testenden Einheit resultiert. Der Jtest Unit Test Assistant verwendet Mockito or PowerMockito um Abhängigkeiten standardmäßig zu verspotten (Sie können dies in den Einstellungen deaktivieren, wenn Sie dies nicht möchten). Durch das Verspotten von Abhängigkeiten kann der Test diese Abhängigkeiten steuern und die Handlermethode vom Rest der Anwendung isolieren, um die Testbemühungen auf den Handler zu konzentrieren. In unserem Beispielhandler ist der finde alle Methode wurde am aufgerufen TodoService - Wenn wir eine echte verwenden TodoServicetesten wir effektiv beide TodoController und dem TodoService. Dies ist möglicherweise das, was wir für einen Integrationstest wünschen, aber nicht für einen Komponententest. Verspottung der Antwort von TodoService.findAll Im Test können wir unsere Testbemühungen auf die Handler-Methode konzentrieren.

(Wenn Sie weitere Informationen zum Verspotten von Abhängigkeiten in Frühlingstests wünschen, Lesen Sie weiter zu meinem nächsten Beitrag.)

Ebook: Verbessern Sie Unit-Tests für Java mit Automatisierung

Frühlingsstiefel

Da Spring Boot eine vereinfachte Konfiguration für Beans sowie zusätzliche Anmerkungen für Tests bietet, generiert der Unit Test Assistant leicht unterschiedliche Tests, wenn er Spring Boot in Ihrem Projekt erkennt. Beispielsweise wird MockMvc automatisch verdrahtet, Abhängigkeiten werden mit @MockBean verspottet und die Annotation @SpringBootTest wird verwendet.

Ausführen von Tests und Analysieren von Ergebnissen

Sie können generierte Tests mit jedem normalen JUnit-Runner ausführen. Parasoft Jtest bietet Symbolleistenaktionen, mit denen die JUnit ausgeführt und der Test analysiert wird.

Nach dem Ausführen der Tests wird der Ablauf der Testausführung angezeigt, und Empfehlungen zur Verbesserung des Tests werden vom Unit Test Assistant abgegeben und in Ihrer IDE gemeldet:

Bereitstellen von Eingaben für die Handlermethode

Handler-Methoden werden häufig so konfiguriert, dass sie Pfad-, Abfrage- oder andere Parameter als Argumente für die Methode akzeptieren. Um die MVC-Handler-Methode zu testen, können Sie mit MockMvc den Pfad / die Abfrage und alle anderen Parameter erstellen, die zum Aufrufen der Methode erforderlich sind.

Der Jtest Unit Test Assistant konfiguriert den Aufruf mockMvc.perform automatisch so, dass die Handler-Methode aufgerufen wird. Einzelne Parameter werden im Test als lokale Variablen (oder Parameter in einem parametrisierten Test) angezeigt, die konfiguriert werden müssen, damit der Test ordnungsgemäß ausgeführt werden kann.

Zum Beispiel (siehe Unit Test Assistant, unten als UTA ​​abgekürzt):

@Test public void testGetPerson() throws Throwable {     // When     String id = ""; // UTA: Configure an appropriate parameter value since the tested method depends on it     ResultActions actions = mockMvc.perform(get("/people/" + id));

Hier das "id"String muss konfiguriert werden. Wenn nicht, lautet der verwendete Pfad" / people / ", und Spring stimmt den angegebenen Pfad nicht mit der entsprechenden Handler-Methode überein.

class = "p1">Der Unit Test Assistant sucht nach verschiedenen Arten von Handler-Methodenparametern und bereitet den Test automatisch auf folgende Weise vor:

  • HttpSession (fügt ein Beispiel hinzu setAttribute () Anruf)
  • Überschriften (fügt a hinzu Header() Anruf),
  • Anfragetext (fügt eine Nutzlastvariable hinzu und Inhalt() Anruf)
  • Authentifizierung (fügt der Beispielinstanziierung eine Beispielinstanziierung hinzu Setup Methode und a Schulleiter() Anruf)

Das Ausführen eines Tests, bei dem die Handler-Methode nicht aufgerufen wird, führt zu einer Empfehlung wie der folgenden:

Überprüfen der Ausgaben der Handler-Methode

Abhängig davon, was die Handlermethode für Anrufer bereitstellen soll, kann sie verschiedene Typen zurückgeben. In den meisten Fällen geben Handler-Methoden entweder a zurück ModelAndView (oder ähnliche Objekte wie Model oder RedirectView) um eine Seite zu bedienen, oder a AntwortEntität irgendeiner Art (manchmal nur das zu serialisierende Rohobjekt). Auf diese Antwort kann das Spring MVC Test Framework zur Validierung zugreifen.

Beispielsweise wurden die folgenden Zusicherungen vom Jtest Unit Test Assistant für eine Handler-Methode hinzugefügt, die a zurückgibt ModelAndView:

  // When
  String id = "1";
  ResultActions actions = mockMvc.perform(get("/people/" + id));
 
  // Then
  // actions.andExpect(status().isOk());
  // actions.andExpect(header().string("", ""));
  // actions.andExpect(view().name(""));
  // actions.andExpect(model().attribute("", ""));

Sobald der Test generiert wurde, können Sie diese Behauptungen auskommentieren und Werte auffüllen, um schnell einen nützlichen und wertvollen Test zu erstellen. Wenn eine Zusicherung zur Laufzeit fehlschlägt, bietet der Unit Test Assistant eine Empfehlung und eine schnelle Lösung, um den erwarteten Wert automatisch zu aktualisieren oder die Zusicherung einfach zu entfernen. Um die Zusicherung schnell mit einem geeigneten Wert einzurichten, können Sie eine Zusicherung auskommentieren, sie fehlschlagen lassen und dann mithilfe einer Schnellkorrektur den richtigen erwarteten Wert festlegen.

Schlussfolgern

Spring (kombiniert mit Spring Boot) ist das führende Java-Anwendungsframework für Unternehmen und erfordert daher ein angemessenes Testniveau, um die Qualität und Sicherheit der damit erstellten Anwendungen zu gewährleisten. Leider wird dieses Testniveau derzeit nicht erreicht, hauptsächlich aufgrund von Zeitmangel und des erforderlichen manuellen Codierungs- und Wartungsaufwands. Der Parasoft Jtest Unit-Test-Assistent Bietet nicht nur Automatisierung von Komponententests, sondern auch geführte Testerstellung und Abhängigkeitsverwaltung, um die Testerstellung zu beschleunigen und die Wartung zu reduzieren.

Um mehr zu erfahren, lesen Sie, wie der Unit Test Assistant helfen kann Abhängigkeitsmanagement mit spöttischen Frameworks.

Erfahren Sie, wie Sie mit Parasoft Jtest Ihre Rendite aus Unit-Tests steigern können.
Fordern Sie jetzt eine Demo an
Geschrieben von

Brian McGlauflin

Brian McGlauflin ist Softwareentwickler bei Parasoft und verfügt über Erfahrung in der Full-Stack-Entwicklung mit Spring und Android, API-Tests und Service-Virtualisierung. Derzeit konzentriert er sich auf automatisierte Softwaretests für Java-Anwendungen mit Parasoft Jtest.

Erhalten Sie die neuesten Nachrichten und Ressourcen zum Testen von Software sofort.