Czy zdarzyło się wam kiedykolwiek debugować problem w testach i logi do niego były beznadziejnie złe? Następnie dodaliście jakieś logi, uruchomiliście kolejny raz test, ale okazało się, że jednak brakuje jeszcze jednego loga.
A co gdyby tak automatycznie logować wszystkie wywołania metod PageObject oraz innych?
Automatyczne logowanie pozwoli nam zapomnieć o konieczności ręcznego dodawania metod loguijących. Możemy do loga dodać nazwy parametrów oraz ich wartości przekazywane do konkretnych metod. Możemy również logować np. xpathy, których używamy do wyszukiwania elementów.
Aby osiągnąć nasz cel, możemy skorzystać z pomocy biblioteki AspectJ. AspectJ jest aspektowym rozszerzeniem dla języka Java realizującym paradygmat programowania aspektowego. [wiki]
Podpięcie AspectJ
Jeżeli używamy Mavena, to możemy szybko podpiąć AspectJ za pomocą dodania zależności:
XML
<properties>
<java.version>17</java.version>
<maven.compiler.release>${java.version}</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<aspectj.version>1.9.21.1</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.9.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>dev.aspectj</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.13.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Następnie napiszmy aspekty, które będą się uruchamiać przed każdym wywołaniem metody page. Możemy to zrobić na kilka sposób. Jednym z nich jest dodanie adnotacji, która będzie wykonywała się przed każdą metodą w klasie, która dziedziczy po bazowej klasie Page.
Java
@Aspect
public class LoggingAspect {
@Before("execution(* pl.webqa.pages.Page+.*(..))")
public void beforeMethodPage(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
}
Musimy teraz pamiętać, że każdy page, który ma być automatycznie logowany, musi dziedziczyć po klasie Page.
Przykładowy page:
Java
public class ExamplePage extends Page {
public void simpleMethod(String arg) { /* TODO */ }
public void anotherMethod(String firstArg, int secondArg) { /* TODO */ }
}
Oraz przykładowy test:
Java
public class ExampleTest {
@Test
public void loggingTest() {
new ExamplePage()
.simpleMethod("WebQA");
new ExamplePage()
.anotherMethod("rating", 10);
}
}
Gdy uruchomimy test to zobaczymy na konsoli dwa wpisy:
Before method: simpleMethod Before method: anotherMethod
Jak:
-
- podpiąc loggera
- zmienić format logów
- podzielić logi na testy
dowiesz się z kolejnych artykułów.