JDI – NOT ONLY UI
22 OCTOBER 2017
Chief QA Automation
In Testing more than 12 years
In Testing Automation 10 years
ROMAN IOVLEV
roman.Iovlev
roman_iovlev@epam.com
3
?
• UI Test Framework
• UI Elements oriented
• Dozens of UI elements already implemented
• Most of common problems already solved (e.g.
stabilization)
4
JDI
• UI Test Framework
• UI Elements oriented
5
JDI
• UI Test Framework
• UI Elements oriented
• Interfaces above engines
6
JDI
JDI HTTP
7
@ServiceDomain("http://httpbin.org/")
public class UserService {
@GET("/get") static RestMethod getUser;
@POST("/post") RestMethod updateSettings;
@PUT("/put") RestMethod addUser;
@PATCH("/patch") RestMethod patch;
@DELETE("/delete") RestMethod removeUser;
8
JDI HTTP
@ServiceDomain("http://httpbin.org/")
public class UserService {
@GET("/get") static M getUser;
@POST("/post") M updateSettings;
@PUT("/put") M addUser;
@PATCH("/patch") M patch;
@DELETE("/delete") M removeUser;
9
JDI HTTP
UserService.addUser.call();
RestResponse resp = getUser.call();
assertEquals(resp.status, 200);
assertEquals(resp.statusType, OK);
assertEquals(resp.body(“name"), “Roman");
resp.assertThat(). body("url",
equalTo("http://httpbin.org/get"))
resp.assertThat().header("Connection", "keep-alive");
10
JDI HTTP
app.addUser.send(user);
User actualUser = app.getUser.asData(User.class);
assertEquals(actualUser, user);
11
JDI HTTP
Entities
@ServiceDomain ("http://httpbin.org/")
public class UserService {
@GET ("/get") RestMethod<User> getUser;
@PUT ("/put") RestMethod<User> addUser;
@ServiceDomain("http://httpbin.org/")
public class UserService {
@ContentType(JSON)
@Headers({
@Header(name = "Name", value = "Roman"),
@Header(name = "Id", value = "Test")
}) @GET("/get") M getUser;
12
JDI HTTP
JDI LIGHT SABER
13
BiConsumer<T,U>, BiFunction<T,U,R>,
BinaryOperator<T>, BiPredicate<T,U>,
Consumer<T>, Function<T,R>, Predicate<T>,
Supplier<T>, UnaryOperator<T>…
14
LIGHT SABER
Lambda: Functional interfaces
for (int i=0;i<10;i++)
click.invoke();
JAVA 8
click = () -> element.click();
JAction, JAction1, JAction2, …, JAction9
JFunc, JFunc1, JFunc2, …, JFunc9
15
LIGHT SABER
Lambda: Functional interfaces
JAction click = () -> element.click();
JAction1<WebDriver> close = driver -> driver.quit();
JFunc3<String[], Integer, Boolean, String> func =
(array, index, flag) -> flag ? array[index] : “none”;
List<Integer> list = asList(1, 3, 2, 6)
16
LIGHT SABER
Stream
List<Integer> even = list.stream()
.filter(i -> i % 2 == 0).collect(Collectors.toList());
List<Integer> even = filter(list, i -> i % 2 == 0);
List<String> nums = map(list, i -> “№”+i);
Boolean hasOdds = any(list, i -> i%2 > 0);
LinqUtils
Integer firstNum = first(list);
17
LIGHT SABER
Integer lastNum = last(list);
listCopy(list, 2, 4);
selectMany(list, i -> asList(i,i*2));
listEquals(asList(1,4,3), asList(3,4,1));
first(list, i -> i > 2);
last(list, I -> i<4);
get(asList(3,4,5,2,3,4,2,1), -3);
LinqUtils
public class User extends DataClass {
public String name;
public String psw;
}
18
LIGHT SABER
DataClass
user.toString() -> User(name=epam;psw=1234)
assertEquals(actualUser, expectedUser);
Map<String,Object> fields=user.asMap();
public class User extends DataClass<User> {
public String name, lastName, nick, description, position;
public Integer id, cardNum, passSeries;
}
19
LIGHT SABER
user.set(u -> u.nick = “Supreme”);
user.set(u->{u.id = 32;u.position=“God”;nick=“Thor”;});
DataClass
print(list);
20
LIGHT SABER
PrintUtils
-> “a,b,c”
print(list, “; ”,”{%s}”); -> “{a}; {b}; {c}”
printFields(user); -> “User(name:epam;psw:admin)”
print(nums,n->”(”+n+”)”); -> “(1)(3)(2)(8)”
public String process(List<String> list) {…}
public String process(String[] array) {…}
public String process(Map<String,Integer> map) {…}
21
LIGHT SABER
Java Collections
Map<String, Integer> map = new HashMap<>();
map.put(“A”,1); map.put(“B”,3); map.put(“C”,100500);
map.put(“D”,-1); map.put(“E”,777); map.put(“F”,2);
public String process(List<String> list) {…}
process(new MapArray());
22
LIGHT SABER
MapArray
MapArray<String, Integer> map
= new MapArray<>(new Object[][]
{{“A”,1},{“B”,3},{“C”,100500},{“D”,-1},{“E”,777},{“F”,2}});
LinqUtils
map.get(3); map.revert();map.get(-2);
PAGE OBJECTS
GEENRATOR
23
new PageObjectsGenerator(rules, urls, output, package)
.generatePageObjects();
24
PAGE OBJECTS GENERATOR LIBRARY
RULES
https://domain.com/
https://domain.com/login
https://domain.com/shop
https://domain.com/about
URLS
{"elements": [{
"type":"Button",
"name": “value",
"css": “input[type=button]"
},
…
]}
OUTPUT
src/main/java
PACKAGE
com.domain
<input type=“button” value=“Next”>
<input type=“button” value=“Previous”>
<button class=“btn”>Submit</button>
25
PAGE OBJECTS GENERATOR LIBRARY
"type":"Button",
"name": “value",
"css": “input[type=button]“
"type":"Button",
"name": “text",
"css": “button.btn"
@Findby(css=“input[type=button][value=Next]”)
public Button next;
@Findby(css=“input[type=button][value=Previous]”)
public Button previous;
@Findby(xpath=“//button[@class=‘btn’
and text()=‘Submit’]”)
public Button submit;
VERIFY LAYOUT
26
@Image(“/src/test/resources/submitbtn.png”)
@FindBy(text = “Submit”)
public Button submit;
27
VERIFY LAYOUT
@Image(“/src/test/resources/submitbtn.png”)
@FindBy(text = “Submit”)
public Button submit;
28
VERIFY LAYOUT
submit.isDisplayed();
submit.assertDisplayed();
@ImagesFolder(“/src/test/resources/imgs”)
public EpamSite extends WebSite;
29
VERIFY LAYOUT
@Image(“submitbtn.png”)
@FindBy(text = “Submit”)
public Button submit;
public class EpamSite extends WebSite {
public static HomePage homePage;
30
VERIFY LAYOUT
public class HomePage extends WebPage
@FindBy(text = “Submit”)
public Button submit;
“src/test/resources/jdi-images/epamsite/
homepage/submit.jpg”
31
VERIFY LAYOUT
homePage.verifyLayout()
homePage.assertLayout() / homePage.checkLayout()
public class EpamSite extends WebSite {
public static HomePage homePage;
public class HomePage extends WebPage
@FindBy(text = “Submit”)
public Button submit;
32
JDI SETUP
README
http://jdi.epam.com/
https://github.com/epam/JDI
https://vk.com/jdi_framework

JDI 2.0. Not only UI testing

  • 1.
    JDI – NOTONLY UI 22 OCTOBER 2017
  • 2.
    Chief QA Automation InTesting more than 12 years In Testing Automation 10 years ROMAN IOVLEV roman.Iovlev roman_iovlev@epam.com
  • 3.
  • 4.
    • UI TestFramework • UI Elements oriented • Dozens of UI elements already implemented • Most of common problems already solved (e.g. stabilization) 4 JDI
  • 5.
    • UI TestFramework • UI Elements oriented 5 JDI
  • 6.
    • UI TestFramework • UI Elements oriented • Interfaces above engines 6 JDI
  • 7.
  • 8.
    @ServiceDomain("http://httpbin.org/") public class UserService{ @GET("/get") static RestMethod getUser; @POST("/post") RestMethod updateSettings; @PUT("/put") RestMethod addUser; @PATCH("/patch") RestMethod patch; @DELETE("/delete") RestMethod removeUser; 8 JDI HTTP
  • 9.
    @ServiceDomain("http://httpbin.org/") public class UserService{ @GET("/get") static M getUser; @POST("/post") M updateSettings; @PUT("/put") M addUser; @PATCH("/patch") M patch; @DELETE("/delete") M removeUser; 9 JDI HTTP
  • 10.
    UserService.addUser.call(); RestResponse resp =getUser.call(); assertEquals(resp.status, 200); assertEquals(resp.statusType, OK); assertEquals(resp.body(“name"), “Roman"); resp.assertThat(). body("url", equalTo("http://httpbin.org/get")) resp.assertThat().header("Connection", "keep-alive"); 10 JDI HTTP
  • 11.
    app.addUser.send(user); User actualUser =app.getUser.asData(User.class); assertEquals(actualUser, user); 11 JDI HTTP Entities @ServiceDomain ("http://httpbin.org/") public class UserService { @GET ("/get") RestMethod<User> getUser; @PUT ("/put") RestMethod<User> addUser;
  • 12.
    @ServiceDomain("http://httpbin.org/") public class UserService{ @ContentType(JSON) @Headers({ @Header(name = "Name", value = "Roman"), @Header(name = "Id", value = "Test") }) @GET("/get") M getUser; 12 JDI HTTP
  • 13.
  • 14.
    BiConsumer<T,U>, BiFunction<T,U,R>, BinaryOperator<T>, BiPredicate<T,U>, Consumer<T>,Function<T,R>, Predicate<T>, Supplier<T>, UnaryOperator<T>… 14 LIGHT SABER Lambda: Functional interfaces for (int i=0;i<10;i++) click.invoke(); JAVA 8 click = () -> element.click();
  • 15.
    JAction, JAction1, JAction2,…, JAction9 JFunc, JFunc1, JFunc2, …, JFunc9 15 LIGHT SABER Lambda: Functional interfaces JAction click = () -> element.click(); JAction1<WebDriver> close = driver -> driver.quit(); JFunc3<String[], Integer, Boolean, String> func = (array, index, flag) -> flag ? array[index] : “none”;
  • 16.
    List<Integer> list =asList(1, 3, 2, 6) 16 LIGHT SABER Stream List<Integer> even = list.stream() .filter(i -> i % 2 == 0).collect(Collectors.toList()); List<Integer> even = filter(list, i -> i % 2 == 0); List<String> nums = map(list, i -> “№”+i); Boolean hasOdds = any(list, i -> i%2 > 0); LinqUtils
  • 17.
    Integer firstNum =first(list); 17 LIGHT SABER Integer lastNum = last(list); listCopy(list, 2, 4); selectMany(list, i -> asList(i,i*2)); listEquals(asList(1,4,3), asList(3,4,1)); first(list, i -> i > 2); last(list, I -> i<4); get(asList(3,4,5,2,3,4,2,1), -3); LinqUtils
  • 18.
    public class Userextends DataClass { public String name; public String psw; } 18 LIGHT SABER DataClass user.toString() -> User(name=epam;psw=1234) assertEquals(actualUser, expectedUser); Map<String,Object> fields=user.asMap();
  • 19.
    public class Userextends DataClass<User> { public String name, lastName, nick, description, position; public Integer id, cardNum, passSeries; } 19 LIGHT SABER user.set(u -> u.nick = “Supreme”); user.set(u->{u.id = 32;u.position=“God”;nick=“Thor”;}); DataClass
  • 20.
    print(list); 20 LIGHT SABER PrintUtils -> “a,b,c” print(list,“; ”,”{%s}”); -> “{a}; {b}; {c}” printFields(user); -> “User(name:epam;psw:admin)” print(nums,n->”(”+n+”)”); -> “(1)(3)(2)(8)”
  • 21.
    public String process(List<String>list) {…} public String process(String[] array) {…} public String process(Map<String,Integer> map) {…} 21 LIGHT SABER Java Collections Map<String, Integer> map = new HashMap<>(); map.put(“A”,1); map.put(“B”,3); map.put(“C”,100500); map.put(“D”,-1); map.put(“E”,777); map.put(“F”,2);
  • 22.
    public String process(List<String>list) {…} process(new MapArray()); 22 LIGHT SABER MapArray MapArray<String, Integer> map = new MapArray<>(new Object[][] {{“A”,1},{“B”,3},{“C”,100500},{“D”,-1},{“E”,777},{“F”,2}}); LinqUtils map.get(3); map.revert();map.get(-2);
  • 23.
  • 24.
    new PageObjectsGenerator(rules, urls,output, package) .generatePageObjects(); 24 PAGE OBJECTS GENERATOR LIBRARY RULES https://domain.com/ https://domain.com/login https://domain.com/shop https://domain.com/about URLS {"elements": [{ "type":"Button", "name": “value", "css": “input[type=button]" }, … ]} OUTPUT src/main/java PACKAGE com.domain
  • 25.
    <input type=“button” value=“Next”> <inputtype=“button” value=“Previous”> <button class=“btn”>Submit</button> 25 PAGE OBJECTS GENERATOR LIBRARY "type":"Button", "name": “value", "css": “input[type=button]“ "type":"Button", "name": “text", "css": “button.btn" @Findby(css=“input[type=button][value=Next]”) public Button next; @Findby(css=“input[type=button][value=Previous]”) public Button previous; @Findby(xpath=“//button[@class=‘btn’ and text()=‘Submit’]”) public Button submit;
  • 26.
  • 27.
  • 28.
    @Image(“/src/test/resources/submitbtn.png”) @FindBy(text = “Submit”) publicButton submit; 28 VERIFY LAYOUT submit.isDisplayed(); submit.assertDisplayed();
  • 29.
    @ImagesFolder(“/src/test/resources/imgs”) public EpamSite extendsWebSite; 29 VERIFY LAYOUT @Image(“submitbtn.png”) @FindBy(text = “Submit”) public Button submit;
  • 30.
    public class EpamSiteextends WebSite { public static HomePage homePage; 30 VERIFY LAYOUT public class HomePage extends WebPage @FindBy(text = “Submit”) public Button submit; “src/test/resources/jdi-images/epamsite/ homepage/submit.jpg”
  • 31.
    31 VERIFY LAYOUT homePage.verifyLayout() homePage.assertLayout() /homePage.checkLayout() public class EpamSite extends WebSite { public static HomePage homePage; public class HomePage extends WebPage @FindBy(text = “Submit”) public Button submit;
  • 32.

Editor's Notes

  • #3 Работаю в компании Epam в