Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

Codeblock
languagexml
title<extension-server>/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    [...]

    <dependencies>

    [...]

        <!-- testing -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.kubek2k</groupId>
            <artifactId>springockito</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.kubek2k</groupId>
            <artifactId>springockito-annotations</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    [...]

</project>

 

Erstellung von testng.xml

Für TestNG Unit Tests ist die Datei testng.xml verpflichtend. In ihr wir wird definiert, welche Tests während des CI Build standardmäßig ausgeführt werden. Um alle Tests auszuführen und Log4j für die Test zu konfigurien, kann die Datei wie folgt aussehen:

Codeblock
languagexml
title<extension-server>/testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="false">
    <listeners>
        <listener class-name="de.bmw.fdm.testng.LoggingListener" />
    </listeners>
    <test name="Test">
        <packages>
            <package name=".*" />
        </packages>
    </test>
    <!-- Test -->
</suite>
<!-- Suite -->

 

...

Log4j für Unit Tests konfigurien

...

Da viele zu testende Klassen mit Logging arbeiten, ist es praktisch immer notwendig, dieses auch zu konfigurieren. In Nuclos wird Log4j als Logging Library verwendet. Daher:

Codeblock
title<server-extension>/src/test/java/log4j.properties
 log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=nuclos-test.log
log4j.appender.logfile.MaxBackupIndex=10
log4j.appender.logfile.MaxFileSize=2GB
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
#log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile.layout.ConversionPattern=%d %-5p %-9t [%c{3}] - %m%n
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.stdout.layout.ConversionPattern=%d %-5p %-9t [%c{3}] - %m%n
log4j.rootLogger=INFO, stdout, logfile

# http://www.benmccann.com/dev-blog/sample-log4j-properties-file/

# Adjust log levels

# SQL logging
log4j.logger.org.nuclos.server.dblayer=DEBUG

#log4j.logger.org.springframework=DEBUG

Die Konfiguration von Log4j ermöglicht es auch, im Unit Test selbst das Logging zu verwenden. Das ist bei der Testentwicklung meist recht praktisch.

Unit Test in TestNG

Die Klassendefinition für einen TestNG Unit Test könnte wie folgt aussehen:

Codeblock
languagejava
title/<extension-server>/src/test/java/de/fdm/server/explorer/PdmcaeExplorerFacadeBeanTest.java
package de.fdm.server.explorer;

import static org.testng.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import static de.bmw.fdm.common.FdmCommon.*;

import org.apache.log4j.Logger;
import org.kubek2k.springockito.annotations.SpringockitoContextLoader;
import org.nuclos.common.EntityMeta;
import org.nuclos.common.UID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

[...] // weitere imports

@ContextConfiguration(loader=SpringockitoContextLoader.class, 
    locations= {"classpath:de/bmw/fdm/server/explorer/spring.xml"})
public class PdmcaeExplorerFacadeBeanTest extends AbstractTestNGSpringContextTests {
    
    private static final Logger LOG = Logger.getLogger(PdmcaeExplorerFacadeBeanTest.class);
 
	[...] // siehe weiter unten   

}

Diese Beispiel benutzt org.springframework.test.context.testng.AbstractTestNGSpringContextTests, um einen TestNG zu erzeugen, der mit einem Spring Test Context arbeitet. Soll der Test zudem transaktional ablaufen, müsste statt dessen von AbstractTransactionalTestNGSpringContextTests geerbt werden.

Die @ContextConfiguration Annotation stellt sicher, dass innerhalb des Spring Test Contextes ganz einfach Mocks erzeugt werden können. Und sie gibt die XML Datei an, aus der der Spring Test Context erzeugt werden soll.

 

...