Autoscalable
open API testing
Yevgeniia Tymoshchuk
About me
About me
About me
https://www.linkedin.com/in
/yevgeniia-tymoshchuk-72451a63
jtymoschuk
tymoschuk.jane@gmail.com
&
Open API - process that uses sets of
technologies that enable websites to
interact with each other by using REST,
SOAP, JavaScript and other web
technologies.
Subject
Problem
http://somesite.com/info
GET:
Problem
http://somesite.com/info
- 4+
GET:
...?category=WEATHER
- 9+
Problem
http://somesite.com/info
- 4+
GET:
...?category=WEATHER&target=ADULTS - 29+
Problem
...?category=WEATHER
- 9+
http://somesite.com/info - 4+
GET:
Approach
Approach
Java: TestNG -> data providers
Approach
Java: TestNG -> data providers
Java: JUnit -> @Parameterized
Approach
Java: TestNG -> data providers
Java: JUnit -> @Parameterized
Python: nose-parameterized
Approach
Java: TestNG -> data providers
Java: JUnit -> @Parameterized
Python: nose-parameterized
Scala: scalatest
Java: TestNG -> data providers
Approach
Java: JUnit -> @Parameterized
Python: nose-parameterized
Scala: scalatest
.Net: NUnit -> [Combinatorial]
@RunWith(Parameterized.class)
public class InfoPositive {
@Parameterized.Parameter
public Target target;
@Parameterized.Parameter(1)
public Category category;
@Parameterized.Parameters(name = "{0} {1}")
public static List<Object[]> data() {
return Arrays.asList(Target.values()).stream().map(target ->
Arrays.asList(Category.values()).stream().map(category ->
new Object[]{target, category}).collect(Collectors.toList()))
.flatMap(Collection::stream).collect(Collectors.toList());
}
Approach
private static final String endpoint = "http://somesite.com/info";
@Test
public void get() {
given().param("target", target)
.param("category", category)
.expect().statusCode(Matchers.equalTo(200))
.when().get(endpoint);
}
Approach
Run:
[KIDS WEATHER]
[KIDS EDUCATION]
[KIDS RACING]
[ADULTS WEATHER]
[ADULTS EDUCATION]
[ADULTS RACING]
[DINOSAURUS WEATHER]
[DINOSAURUS EDUCATION]
[DINOSAURUS RACING]
Approach in action
Evolution
@Parameterized.Parameters
Evolution
@Parameterized.Parameters
@ConcurrentParametrized.Parameters
Evolution
@Parameterized.Parameters
@ConcurrentParametrized.Parameters
@ConcurrentParametrized.Parameters(threads = 4)
Evolution
@ConcurrentParametrizedDependent.Parameters(threads = 4)
@Parameterized.Parameters
@ConcurrentParametrized.Parameters
@ConcurrentParametrized.Parameters(threads = 4)
Evolution
@RunWith(SmokeRunner.class)
public class SmokeSuite {
@ConcurrentParametrized.Parameters(threads = 25)
public static Collection dataProvider() {
return Arrays.asList(new Object[][]{
{ConcurrentParametrizedDependentTest.class, data(10)},
{ConcurrentParametrizedDependentTest.class, all()},
{ConcurrentParametrizedDependentTest.class, method("test1")},
});
}
}
Smoke
+/-
+
● Flexible smoke suite
● Automatically extendable regression
● Human readable results
● Happy team
-
● Time
● Test method for a specific data set (not
implemented)
● Not clear data() method signature
Tools
● Allure report
● Rest-assured
● Junit
● TeamCity
● Java 8 with lambdas
Tools
● Allure report
● Rest-assured
● Junit
● TeamCity
● Java 8 with lambdas
Thank you
Q&A

Autoscalable open API testing