[Cucumber TestNG] Bài 14: Xây dựng Test Listener với Cucumber Listener

✅ Cucumber Listener là gì?
✅ Xây dựng Cucumber Listener

✅ Cucumber Listener là gì?

Cucumber Listener là một trình lắng nghe các sự kiện diễn ra trong quá trình thực thi test cases của project test automation với Cucumber Framework do Anh Tester xây dựng lại với sự kế thừa từ các Events trong interface EventListener do Cucumber Framework cung cấp.

Cucumber Listener giống như Test Listener mà bên TestNG Framework chúng ta đã xây dựng và sử dụng.

 

✅ Xây dựng Cucumber Listener

Bước 1: Tạo class CucumberListener trong package hooks chung với class CucumberHooks

[Cucumber TestNG] Bài 14: Xây dựng Test Listener với Cucumber Listener | Anh Tester

Bước 2
: Xây dựng các hàm lắng nghe trong class CucumberListener kế thừa từ EventListener

package com.anhtester.hooks;

import io.cucumber.plugin.EventListener;
import io.cucumber.plugin.event.*;

public class CucumberListener implements EventListener {

    //Khai báo các biến để thống kê tổng số test cases sau khi kết thúc test
    public static int count_totalTCs;
    public static int count_passedTCs;
    public static int count_skippedTCs;
    public static int count_failedTCs;

    @Override
    public void setEventPublisher(EventPublisher publisher) {

        //Set all events that need use (public). Override from EventListener
        publisher.registerHandlerFor(TestRunStarted.class, this::runStarted);
        publisher.registerHandlerFor(TestRunFinished.class, this::runFinished);
        publisher.registerHandlerFor(TestSourceRead.class, this::featureRead);
        publisher.registerHandlerFor(TestCaseStarted.class, this::ScenarioStarted);
        publisher.registerHandlerFor(TestCaseFinished.class, this::ScenarioFinished);
        publisher.registerHandlerFor(TestStepStarted.class, this::stepStarted);
        publisher.registerHandlerFor(TestStepFinished.class, this::stepFinished);

    }

    /*
     * Khai báo các hàm đã set events bên trên để lắng nghe từng event
     */

    // Here we create the reporter. Execute before run feature file
    private void runStarted(TestRunStarted event) {

    }

    // runFinished event is triggered when all feature file executions are completed
    private void runFinished(TestRunFinished event) {

    }

    // This event is triggered when feature file is read
    // here we create the feature node
    private void featureRead(TestSourceRead event) {
        String featureSource = event.getUri().toString();
        String featureName = featureSource.split(".*/")[1];
        System.out.println("Feature Source: " + featureSource);
        System.out.println("Feature Name: " + featureName);
    }

    private void ScenarioStarted(TestCaseStarted event) {
        String featureName = event.getTestCase().getUri().toString();
        System.out.println("Feature Name: " + featureName);

        count_totalTCs = count_totalTCs + 1;
    }

    private void ScenarioFinished(TestCaseFinished event) {
        String featureName = event.getTestCase().getUri().toString();

        //Tại đây thì chúng ta thống kê các Scenario. Vì trong Cucumber thì một test cases là một Scenario
        if (event.getResult().getStatus().toString().equals("PASSED")) {
            count_passedTCs = count_passedTCs + 1;
        }
        if (event.getResult().getStatus().toString().equals("FAILED")) {
            count_failedTCs = count_failedTCs + 1;
        }
        if (event.getResult().getStatus().toString().equals("SKIPPED")) {
            count_skippedTCs = count_skippedTCs + 1;
        }
    }

    // Step started event
    private void stepStarted(TestStepStarted event) {

        String stepName = "";
        String keyword = "";

        // Check whether the event is from a hook or step
        if (event.getTestStep() instanceof PickleStepTestStep) {
            // TestStepStarted event implements PickleStepTestStep interface
            // Which have additional methods to interact with the event object
            // So we have to cast TestCase object to get those methods
            PickleStepTestStep steps = (PickleStepTestStep) event.getTestStep();
            stepName = steps.getStep().getText();
            keyword = steps.getStep().getKeyword();

        } else {
            // Same with HookTestStep
            HookTestStep hoo = (HookTestStep) event.getTestStep();
            stepName = hoo.getHookType().name();
        }

    }

    // This is triggered when test Step is finished
    private void stepFinished(TestStepFinished event) {
        String stepName = "";
        String keyword = "";

        if (event.getTestStep() instanceof PickleStepTestStep) {
            PickleStepTestStep steps = (PickleStepTestStep) event.getTestStep();
            stepName = steps.getStep().getText();
            keyword = steps.getStep().getKeyword();
        } else {
            HookTestStep hoo = (HookTestStep) event.getTestStep();
            stepName = hoo.getHookType().name();
        }

        //Các bạn có thể screenshot hay như thế nào đó tuỳ ý cho mỗi step với trạng thái tương ứng
        if (event.getResult().getStatus().toString().equals("PASSED")) {

        }
        if (event.getResult().getStatus().toString().equals("FAILED")) {
            System.out.println("=========== afterStep " + stepName + " ==========");
            System.out.println(event.getResult().getError());
        }
        if (event.getResult().getStatus().toString().equals("SKIPPED")) {

        }
    }

}

[Cucumber TestNG] Bài 14: Xây dựng Test Listener với Cucumber Listener | Anh Tester


Bước 3
: Gọi class CucumberListener vào phần Plugin của các Test Runner

plugin = {
    "com.anhtester.hooks.CucumberListener",
}

[Cucumber TestNG] Bài 14: Xây dựng Test Listener với Cucumber Listener | Anh Tester

Cuối cùng là thực thi Test Runner để xem các sự kiện diễn ra với từng status tương ứng mà chúng ta đã thiết kế trong CucumberListener


[Cucumber TestNG] Bài 14: Xây dựng Test Listener với Cucumber Listener | Anh Tester

Như vậy là code trong CucumberListener mà chúng ta khai báo đã lắng nghe được các sự kiện diễn ra đối với Feature file, ScenarioSteps.

  • Anh Tester

    Đường dẫu khó chân vẫn cần bước đi
    Đời dẫu khổ tâm vẫn cần nghĩ thấu