Лаконічні та елегантні автоматизовані тести? Безболісний (майже) тестовий стек для UI веб-додатків? Більше часу, щоб випити кави/пограти у Cuphead/ подивитись у порожнечу?
Ми поговоримо про Lombok, Vavr, Owner, чому вам варто використовувати готові рішення та як зробити тести більш лаконічними та читабельними. Вам знадобиться Vaper та/або гіроборд.
2. 4+ years of test automation experience
(in company, freelance)
Enjoys building simple and elegant
solutions
Has beautiful eyes
3. READABILITY
more than 70% of a developers time is spend
reading and understanding code*
*https://blogs.msdn.microsoft.com/peterhal/2006/01/04/what-do-programmers-really-do-anyway-aka-part-2-of-the-yardstick-saga/
4. Tuning your language
extension libraries
new features
Readable web UI test stack
Sculpting! Your! Tests!
WE’LL TALK:
7. LOCAL VARIABLE TYPE INFERENCE
boolean isRemoteEnabled = true;
final String browser = getProperty("browser", "FIREFOX");
final ArrayList<ProductType> productTypeList = new ArrayList<>();
var isRemoteEnabled = true;
val browser = getProperty("browser", "FIREFOX");
val productTypeList = new ArrayList<ProductType>();
8. TYPE INFERENCE
val – final local variable
var – non-final local variable
works on:
local variables
loop scope variables
https://habrahabr.ru/post/280075/
http://openjdk.java.net/jeps/286
9. POJO
public AutomationEngineer(String name,
boolean likesToBuildFrameworks,
boolean hatesBDD) {
this.name = name;
this.likesToBuildFrameworks = likesToBuildFrameworks;
this.hatesBDD = hatesBDD;
}
public class AutomationEngineer {
…
private final String name;
private final boolean likesToBuildFrameworks;
private final boolean hatesBDD;
10. public String getName() {return name;}
public boolean hatesBDD() { return hatesBDD; }
public boolean likesToBuildFrameworks() { … }
@Override
public boolean equals(Object o) { … }
@Override
public int hashCode() { … }
@Override
public String toString() { … }
}
POJO
11. LOMBOK
public class AutomationEngineer {
private final String name;
private final boolean likesToBuildFrameworks;
private final boolean hatesBDD;
}
@Data
12. public enum State {
ALABAMA("AL", 1),
ALASKA("AK", 2),
ARIZONA("AZ", 3),
CALIFORNIA("CA", 4);
private final String shortName;
private final int stateIndex;
}
LOMBOK
State(String shortName, int stateIndex) {
this.shortName = shortName;
this.stateIndex = stateIndex;
}
public String getShortName() { return shortName; }
public int getStateIndex() { return stateIndex; }
}
@Getter
@RequiredArgsConstructor
15. EXTENSION METHOD
public class WebElementExtension {
public static WebElement getClickableElement(WebDriver driver, By by){
return new WebDriverWait(driver, 30)
.until(ExpectedConditions.elementToBeClickable(by));
}
}
@ExtensionMethod(WebElementExtension.class)
public class ExtensionMethodExample {
@Test
void testDriverExtension(){
new ChromeDriver()
.getClickableElement(By.id("some_id"))
.click();
}
}
17. VAVR (EX JAVASLANG)
functional library for Java 8+ to reduce the amount
of code and to increase the robustness
http://blog.vavr.io/
18. PATTERN MATCHING
act of checking a given sequence for the
presence of the constituents of some pattern
http://cr.openjdk.java.net/~briangoetz/amber/pattern-match.html
19. PLAIN JAVA
public void filterUsersBy(UserType user) {
WebElement userLocator;
switch (user) {
case ADMIN:
userLocator = adminUserLocator; break;
case MEMBER:
userLocator = memberUserLocator; break;
case VENDOR:
userLocator = vendorUserLocator; break;
default:
userLocator = superAdminLocator; break;
}
select(userLocator);
click(filterButton);
}