Przejdź do treści

Automatyczne logowanie

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.

    Dodaj komentarz

    Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *


    The reCAPTCHA verification period has expired. Please reload the page.