Захотелось поделиться с вами моим способом тестирования веб-сервисов.
Принцип такой:
1. Создаем maven проект.
2. Настраиваем его так, чтобы с каждым запуском выполнялось следующее:
2.1. загружалось WSDL описание сервиса по ссылке
2.2. генерировался код клиента на основе WSDL описания
2.3. генерировался код ассертов для классов, участвующих в проверках, в том числе тех, которые были сгенерированы на предыдущем этапе
3. Пишем тесты.
4. Добавляем проект в jenkins, который и запускает само тестирование.
Нам понадобятся следующие инструменты: Java, maven, AssertJ, TestNG.
AssertJ — интересный фреймворк, который, помимо всего прочего, умеет генерировать асерты для конкретных классов. Это позволяет писать тесты так:
И, в случае ошибки, результат будет таким:
Для своего примера, я выбрал один из публичных сервисов Яндекса — tech.yandex.ru/speller/doc/dg/concepts/api-overview-docpage
Приступим:
1. Создаем проект maven обычным способом, например так:
2. Редактируем pom.xml. Добавляем плагины:
Важно еще то, что имеется возможность редактирования шаблонов, для более тонкой настройки генерации асертов.
Добавляем зависимости:
3. Код тестовых методов выглядит так:
Проверить работу можно выполнив команду mvn test
Ссылки:
AssertJ — http://joel-costigliola.github.io/assertj/
Рабочий пример — SOAPTester
Принцип такой:
1. Создаем maven проект.
2. Настраиваем его так, чтобы с каждым запуском выполнялось следующее:
2.1. загружалось WSDL описание сервиса по ссылке
2.2. генерировался код клиента на основе WSDL описания
2.3. генерировался код ассертов для классов, участвующих в проверках, в том числе тех, которые были сгенерированы на предыдущем этапе
3. Пишем тесты.
4. Добавляем проект в jenkins, который и запускает само тестирование.
Нам понадобятся следующие инструменты: Java, maven, AssertJ, TestNG.
AssertJ — интересный фреймворк, который, помимо всего прочего, умеет генерировать асерты для конкретных классов. Это позволяет писать тесты так:
//Выполняем запрос к сервису
CheckTextRequest r = new CheckTextRequest();
r.setText("Фраза с ошибкой в слове БРОШУРА");
CheckTextResponse resp = port.checkText(r);
SpellError sError = resp.getSpellResult().getError().get(0);
//проверяем ответ c помощью сгенерированных асертов
soft.assertThat(sError )
.as("Проверка SpellError")
.hasCode(1)
.hasCol(24)
.hasLen(7)
.hasPos(24)
.hasRow(0)
.hasWord("БРОШУРА555")
.hasOnlyS("БРОШЮРА ошибка");
И, в случае ошибки, результат будет таким:
The following assertion failed:
1) [Проверка SpellError]
Expecting word of:
<net.yandex.speller.services.spellservice.SpellError@61ca2dfa>
to be:
<БРОШУРА555>
but was:
<БРОШУРА>
at org.assertj.SoftAssertions.assertAll(SoftAssertions.java:32)
at ru.x_noname.test.SOAPTest$Listener.afterInvocation(SOAPTest.java:69)
...
Для своего примера, я выбрал один из публичных сервисов Яндекса — tech.yandex.ru/speller/doc/dg/concepts/api-overview-docpage
Приступим:
1. Создаем проект maven обычным способом, например так:
mvn archetype:generate -DgroupId=ru.x_noname.test -DartifactId=SOAPTester -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
2. Редактируем pom.xml. Добавляем плагины:
Плагин для чистки сгенерированных классов
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<filesets>
<fileset>
<directory>${project.basedir}/src/generated</directory>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
</plugin>
Плагин для загрузки WDSL описания
<plugin>
<groupId>com.googlecode.maven-download-plugin</groupId>
<artifactId>maven-download-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>Download Mayak</id>
<goals>
<goal>wget</goal>
</goals>
<phase>validate</phase>
<configuration>
<url>http://speller.yandex.net/services/spellservice?WSDL</url>
<outputDirectory>${project.build.directory}/resources/wsdl</outputDirectory>
<outputFileName>spellservice.xml</outputFileName>
<skipCache>true</skipCache>
</configuration>
</execution>
</executions>
</plugin>
Плагин для генерации кода клиента по WDSL описанию
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.1.3</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.basedir}/src/generated</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${project.build.directory}/resources/wsdl/spellservice.xml</wsdl>
<extraargs>
<extraarg>-client</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
Плагин для генерации ассертов на основе классов из WDSL
<plugin>
<groupId>org.assertj</groupId>
<artifactId>assertj-assertions-generator-maven-plugin</artifactId>
<version>2.0.0</version>
<executions>
<execution>
<goals>
<goal>generate-assertions</goal>
</goals>
</execution>
</executions>
<configuration>
<classes>
<param>net.yandex.speller.services.spellservice.SpellResult</param>
<param>net.yandex.speller.services.spellservice.SpellError</param>
</classes>
<hierarchical>true</hierarchical>
<entryPointClassPackage>org.assertj</entryPointClassPackage>
<targetDir>${project.basedir}/src/generated</targetDir>
<generateSoftAssertions>true</generateSoftAssertions>
<!-- Если функционала в сгенерированных аасертах вам не хватает. то можно добавить шаблоны
<templates>
<templatesDirectory>src/main/resources/templates/</templatesDirectory>
<softEntryPointAssertionClass>class.txt</softEntryPointAssertionClass>
<softEntryPointAssertionMethod>method.txt</softEntryPointAssertionMethod>
<objectAssertion>object.txt</objectAssertion>
<wholeNumberAssertion>primirives.txt</wholeNumberAssertion>
<wholeNumberWrapperAssertion>wrappers.txt</wholeNumberWrapperAssertion>
</templates>
-->
</configuration>
</plugin>
Важно еще то, что имеется возможность редактирования шаблонов, для более тонкой настройки генерации асертов.
Плагин включает сгенерированные классы в проект
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.9.1</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.basedir}/src/generated</source> </sources> </configuration> </execution> </executions> </plugin>
Добавляем зависимости:
Необходимые зависимости
<!-- необходимые зависимости -->
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.8</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.2.0</version>
</dependency>
3. Код тестовых методов выглядит так:
@Test(description = "Позитивный тест")
public void t1_positive() throws Exception {
CheckTextRequest r = new CheckTextRequest();
r.setText("Фраза без ошибок");
CheckTextResponse resp = port.checkText(r);
SpellResult res = resp.getSpellResult();
soft.assertThat(res).as("Проверка SpellResult").hasNoError();
}
@Test(description = "Негативный тест")
public void t2_negative() throws Exception {
CheckTextRequest r = new CheckTextRequest();
r.setText("Фраза с ошибкой в слове БРОШУРА");
CheckTextResponse resp = port.checkText(r);
SpellResult res = resp.getSpellResult();
SpellError sError = res.getError().get(0);
soft.assertThat(sError).as("Проверка SpellError")
.hasCode(1)
.hasCol(24)
.hasLen(7)
.hasPos(24)
.hasRow(0)
.hasWord("БРОШУРА")
.hasOnlyS("БРОШЮРА");
//методы has... - сгенерированы с помощью AssertJ
}
Проверить работу можно выполнив команду mvn test
Ссылки:
AssertJ — http://joel-costigliola.github.io/assertj/
Рабочий пример — SOAPTester