Przejdź do głównej treści

Frameworki

WebdriverIO Runner ma wbudowane wsparcie dla Mocha, Jasmine i Cucumber.js. Możesz również zintegrować go z zewnętrznymi frameworkami open-source, takimi jak Serenity/JS.

Integracja WebdriverIO z frameworkami testowymi

Aby zintegrować WebdriverIO z frameworkiem testowym, potrzebujesz pakietu adaptera dostępnego na NPM. Pamiętaj, że pakiet adaptera musi być zainstalowany w tym samym miejscu, gdzie jest zainstalowane WebdriverIO. Więc jeśli zainstalowałeś WebdriverIO globalnie, upewnij się, że również zainstalowałeś pakiet adaptera globalnie.

Integracja WebdriverIO z frameworkiem testowym pozwala na dostęp do instancji WebDrivera przy użyciu globalnej zmiennej browser w plikach specyfikacji lub definicjach kroków. Zauważ, że WebdriverIO zajmie się również tworzeniem i kończeniem sesji Selenium, więc nie musisz tego robić samodzielnie.

Używanie Mocha

Najpierw zainstaluj pakiet adaptera z NPM:

npm install @wdio/mocha-framework --save-dev

Domyślnie WebdriverIO dostarcza bibliotekę asercji, która jest wbudowana i z której możesz korzystać od razu:

describe('my awesome website', () => {
it('should do some assertions', async () => {
await browser.url('https://webdriver.io')
await expect(browser).toHaveTitle('WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO')
})
})

WebdriverIO obsługuje interfejsy Mocha BDD (domyślny), TDD i QUnit interfaces.

Jeśli chcesz pisać swoje specyfikacje w stylu TDD, ustaw właściwość ui w konfiguracji mochaOpts na tdd. Teraz twoje pliki testowe powinny być napisane w następujący sposób:

suite('my awesome website', () => {
test('should do some assertions', async () => {
await browser.url('https://webdriver.io')
await expect(browser).toHaveTitle('WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO')
})
})

Jeśli chcesz zdefiniować inne ustawienia specyficzne dla Mocha, możesz to zrobić za pomocą klucza mochaOpts w pliku konfiguracyjnym. Listę wszystkich opcji można znaleźć na stronie projektu Mocha.

Uwaga: WebdriverIO nie wspiera przestarzałego używania callbacków done w Mocha:

it('should test something', (done) => {
done() // wyrzuca "done is not a function"
})

Opcje Mocha

Poniższe opcje można zastosować w pliku wdio.conf.js, aby skonfigurować środowisko Mocha. Uwaga: nie wszystkie opcje są obsługiwane, np. zastosowanie opcji parallel spowoduje błąd, ponieważ testrunner WDIO ma własny sposób uruchamiania testów równolegle. Możesz przekazywać te opcje frameworka jako argumenty, np.:

wdio run wdio.conf.ts --mochaOpts.grep "my test" --mochaOpts.bail --no-mochaOpts.checkLeaks

To przekaże następujące opcje Mocha:

{
grep: ['my-test'],
bail: true
checkLeacks: false
}

Obsługiwane są następujące opcje Mocha:

require

Opcja require jest przydatna, gdy chcesz dodać lub rozszerzyć podstawową funkcjonalność (opcja frameworka WebdriverIO).

Type: string|string[]
Default: []

compilers

Używaj podanego modułu (lub modułów) do kompilacji plików. Kompilatory zostaną dołączone przed wymogami (opcja frameworka WebdriverIO).

Type: string[]
Default: []

allowUncaught

Propagowanie nieobsłużonych błędów.

Type: boolean
Default: false

bail

Zakończ po pierwszym nieudanym teście.

Type: boolean
Default: false

checkLeaks

Sprawdź wycieki zmiennych globalnych.

Type: boolean
Default: false

delay

Opóźnij wykonanie głównego zestawu.

Type: boolean
Default: false

fgrep

Filtrowanie testów według danego ciągu znaków.

Type: string
Default: null

forbidOnly

Testy oznaczone jako only powodują niepowodzenie zestawu.

Type: boolean
Default: false

forbidPending

Oczekujące testy powodują niepowodzenie zestawu.

Type: boolean
Default: false

fullTrace

Pełny ślad stosu przy niepowodzeniu.

Type: boolean
Default: false

global

Zmienne oczekiwane w globalnym zakresie.

Type: string[]
Default: []

grep

Filtrowanie testów za pomocą wyrażenia regularnego.

Type: RegExp|string
Default: null

invert

Odwróć dopasowania filtra testów.

Type: boolean
Default: false

retries

Liczba powtórzeń nieudanych testów.

Type: number
Default: 0

timeout

Wartość progu limitu czasu (w ms).

Type: number
Default: 30000

Używanie Jasmine

Najpierw zainstaluj pakiet adaptera z NPM:

npm install @wdio/jasmine-framework --save-dev

Następnie możesz skonfigurować swoje środowisko Jasmine, ustawiając właściwość jasmineOpts w konfiguracji. Listę wszystkich opcji można znaleźć na stronie projektu Jasmine.

Opcje Jasmine

Poniższe opcje można zastosować w pliku wdio.conf.js, aby skonfigurować środowisko Jasmine za pomocą właściwości jasmineOpts. Aby uzyskać więcej informacji na temat tych opcji konfiguracyjnych, sprawdź dokumentację Jasmine. Możesz przekazywać te opcje frameworka jako argumenty, np.:

wdio run wdio.conf.ts --jasmineOpts.grep "my test" --jasmineOpts.failSpecWithNoExpectations --no-jasmineOpts.random

To przekaże następujące opcje Mocha:

{
grep: ['my-test'],
bail: true
checkLeacks: false
}

Obsługiwane są następujące opcje Jasmine:

defaultTimeoutInterval

Domyślny interwał limitu czasu dla operacji Jasmine.

Type: number
Default: 60000

helpers

Tablica ścieżek plików (i wzorców glob) względem spec_dir do dołączenia przed specyfikacjami jasmine.

Type: string[]
Default: []

requires

Opcja requires jest przydatna, gdy chcesz dodać lub rozszerzyć podstawową funkcjonalność.

Type: string[]
Default: []

random

Czy losować kolejność wykonywania specyfikacji.

Type: boolean
Default: true

seed

Ziarno do użycia jako podstawa losowości. Null powoduje, że ziarno jest określane losowo na początku wykonania.

Type: Function
Default: null

failSpecWithNoExpectations

Czy specyfikacja ma zakończyć się niepowodzeniem, jeśli nie uruchomiła żadnych oczekiwań. Domyślnie specyfikacja, która nie uruchomiła żadnych oczekiwań, jest raportowana jako zaliczona. Ustawienie tego na true spowoduje zgłoszenie takiej specyfikacji jako niepowodzenia.

Type: boolean
Default: false

oneFailurePerSpec

Czy specyfikacje mają mieć tylko jedno niepowodzenie oczekiwania.

Type: boolean
Default: false

specFilter

Funkcja do filtrowania specyfikacji.

Type: Function
Default: (spec) => true

grep

Uruchamiaj tylko testy pasujące do tego ciągu znaków lub wyrażenia regularnego. (Dotyczy tylko przypadków, gdy nie jest ustawiona niestandardowa funkcja specFilter)

Type: string|Regexp
Default: null

invertGrep

Jeśli ma wartość true, odwraca dopasowywanie testów i uruchamia tylko testy, które nie pasują do wyrażenia użytego w grep. (Dotyczy tylko przypadków, gdy nie jest ustawiona niestandardowa funkcja specFilter)

Type: boolean
Default: false

Używanie Cucumber

Najpierw zainstaluj pakiet adaptera z NPM:

npm install @wdio/cucumber-framework --save-dev

Jeśli chcesz używać Cucumber, ustaw właściwość framework na cucumber, dodając framework: 'cucumber' do pliku konfiguracyjnego.

Opcje dla Cucumber można podać w pliku konfiguracyjnym za pomocą cucumberOpts. Sprawdź pełną listę opcji tutaj.

Aby szybko rozpocząć pracę z Cucumber, zapoznaj się z naszym projektem cucumber-boilerplate, który zawiera wszystkie definicje kroków, jakich potrzebujesz na start, i będziesz mógł od razu pisać pliki funkcji.

Opcje Cucumber

Poniższe opcje można zastosować w pliku wdio.conf.js, aby skonfigurować środowisko Cucumber za pomocą właściwości cucumberOpts:

Dostosowywanie opcji przez wiersz poleceń

Opcje cucumberOpts, takie jak niestandardowe tags do filtrowania testów, można określić za pomocą wiersza poleceń. Można to osiągnąć, używając formatu cucumberOpts.{nazwaOpcji}="wartość".

Na przykład, jeśli chcesz uruchomić tylko testy oznaczone tagiem @smoke, możesz użyć następującego polecenia:

# Gdy chcesz uruchomić tylko testy z tagiem "@smoke"
npx wdio run ./wdio.conf.js --cucumberOpts.tags="@smoke"
npx wdio run ./wdio.conf.js --cucumberOpts.name="some scenario name" --cucumberOpts.failFast

To polecenie ustawia opcję tags w cucumberOpts na @smoke, zapewniając, że tylko testy z tym tagiem są wykonywane.

backtrace

Pokaż pełny backtrace dla błędów.

Type: Boolean
Default: true

requireModule

Wymagaj modułów przed wymaganiem jakichkolwiek plików wsparcia.

Type: string[]
Default: []
Example:

cucumberOpts: {
requireModule: ['@babel/register']
// lub
requireModule: [
[
'@babel/register',
{
rootMode: 'upward',
ignore: ['node_modules']
}
]
]
}

failFast

Przerwij wykonywanie po pierwszym niepowodzeniu.

Type: boolean
Default: false

name

Wykonuj tylko scenariusze z nazwą pasującą do wyrażenia (powtarzalne).

Type: RegExp[]
Default: []

require

Wymagaj plików zawierających definicje kroków przed wykonaniem funkcji. Możesz również określić wzorzec glob dla swoich definicji kroków.

Type: string[]
Default: [] Example:

cucumberOpts: {
require: [path.join(__dirname, 'step-definitions', 'my-steps.js')]
}

import

Ścieżki do miejsc, gdzie znajduje się twój kod wsparcia, dla ESM.

Type: String[]
Default: [] Example:

cucumberOpts: {
import: [path.join(__dirname, 'step-definitions', 'my-steps.js')]
}

strict

Niepowodzenie, jeśli istnieją niezdefiniowane lub oczekujące kroki.

Type: boolean
Default: false

tags

Wykonuj tylko funkcje lub scenariusze z tagami pasującymi do wyrażenia. Więcej informacji znajdziesz w dokumentacji Cucumber.

Type: String
Default: ``

timeout

Limit czasu w milisekundach dla definicji kroków.

Type: Number
Default: 30000

retry

Określ liczbę ponownych prób nieudanych przypadków testowych.

Type: Number
Default: 0

retryTagFilter

Powtarzaj tylko funkcje lub scenariusze z tagami pasującymi do wyrażenia (powtarzalne). Ta opcja wymaga określenia '--retry'.

Type: RegExp

language

Domyślny język dla twoich plików funkcji

Type: String
Default: en

order

Uruchamiaj testy w zdefiniowanej / losowej kolejności

Type: String
Default: defined

format

Nazwa i ścieżka pliku wyjściowego formatera do użycia. WebdriverIO obsługuje głównie tylko Formatterów, którzy zapisują dane wyjściowe do pliku.

Type: string[]

formatOptions

Opcje do dostarczenia formatterom

Type: object

tagsInTitle

Dodaj tagi cucumber do nazwy funkcji lub scenariusza

Type: Boolean
Default: false

Proszę zauważyć, że jest to opcja specyficzna dla @wdio/cucumber-framework i nie jest rozpoznawana przez samego cucumber-js

ignoreUndefinedDefinitions

Traktuj niezdefiniowane definicje jako ostrzeżenia.

Type: Boolean
Default: false

Proszę zauważyć, że jest to opcja specyficzna dla @wdio/cucumber-framework i nie jest rozpoznawana przez samego cucumber-js

failAmbiguousDefinitions

Traktuj niejednoznaczne definicje jako błędy.

Type: Boolean
Default: false

Proszę zauważyć, że jest to opcja specyficzna dla @wdio/cucumber-framework i nie jest rozpoznawana przez samego cucumber-js

tagExpression

Wykonuj tylko funkcje lub scenariusze z tagami pasującymi do wyrażenia. Więcej informacji znajdziesz w dokumentacji Cucumber.

Type: String
Default: ``

Proszę zauważyć, że ta opcja będzie przestarzała w przyszłości. Zamiast tego użyj właściwości konfiguracyjnej tags

profile

Określ profil do użycia.

Type: string[]
Default: []

Uprzejmie zauważ, że tylko określone wartości (worldParameters, name, retryTagFilter) są obsługiwane w profilach, ponieważ cucumberOpts ma pierwszeństwo. Dodatkowo, korzystając z profilu, upewnij się, że wymienione wartości nie są zadeklarowane w ramach cucumberOpts.

Pomijanie testów w cucumber

Zauważ, że jeśli chcesz pominąć test za pomocą zwykłych funkcji filtrowania testów Cucumber dostępnych w cucumberOpts, zrobisz to dla wszystkich przeglądarek i urządzeń skonfigurowanych w możliwościach. Aby móc pomijać scenariusze tylko dla określonych kombinacji możliwości bez konieczności rozpoczynania sesji, jeśli nie jest to konieczne, webdriverio zapewnia następującą specyficzną składnię tagów dla cucumber:

@skip([condition])

gdzie condition jest opcjonalną kombinacją właściwości capabilities z ich wartościami, które gdy wszystkie zostaną dopasowane, spowodują pominięcie oznaczonego scenariusza lub funkcji. Oczywiście możesz dodać kilka tagów do scenariuszy i funkcji, aby pomijać testy w różnych warunkach.

Możesz również użyć adnotacji '@skip' do pomijania testów bez zmiany tagExpression. W tym przypadku pominięte testy będą wyświetlane w raporcie testowym.

Oto kilka przykładów tej składni:

  • @skip lub @skip(): zawsze pominie oznaczony element
  • @skip(browserName="chrome"): test nie zostanie wykonany na przeglądarkach chrome.
  • @skip(browserName="firefox";platformName="linux"): pominie test w wykonaniach firefox na linuxie.
  • @skip(browserName=["chrome","firefox"]): oznaczone elementy zostaną pominięte zarówno dla przeglądarek chrome, jak i firefox.
  • @skip(browserName=/i.*explorer/): możliwości z przeglądarkami pasującymi do wyrażenia regularnego zostaną pominięte (jak iexplorer, internet explorer, internet-explorer, ...).

Import pomocnika definicji kroków

Aby używać pomocnika definicji kroków, takiego jak Given, When lub Then lub hooki, musisz je zaimportować z @cucumber/cucumber, np. w ten sposób:

import { Given, When, Then } from '@cucumber/cucumber'

Teraz, jeśli używasz już Cucumber do innych rodzajów testów niezwiązanych z WebdriverIO, dla których używasz określonej wersji, musisz importować te pomocniki w swoich testach e2e z pakietu WebdriverIO Cucumber, np.:

import { Given, When, Then, world, context } from '@wdio/cucumber-framework'

Zapewnia to, że używasz właściwych pomocników w ramach frameworka WebdriverIO i pozwala używać niezależnej wersji Cucumber dla innych rodzajów testów.

Publikowanie raportu

Cucumber oferuje funkcję publikowania raportów z testów na stronie https://reports.cucumber.io/, którą można kontrolować albo przez ustawienie flagi publish w cucumberOpts, albo przez skonfigurowanie zmiennej środowiskowej CUCUMBER_PUBLISH_TOKEN. Jednak gdy używasz WebdriverIO do wykonywania testów, istnieje ograniczenie w tym podejściu. Aktualizuje ono raporty osobno dla każdego pliku funkcji, co utrudnia przeglądanie skonsolidowanego raportu.

Aby rozwiązać to ograniczenie, wprowadziliśmy metodę opartą na promise o nazwie publishCucumberReport w @wdio/cucumber-framework. Ta metoda powinna być wywoływana w hooku onComplete, który jest optymalnym miejscem do jej wywołania. publishCucumberReport wymaga wprowadzenia katalogu raportu, w którym przechowywane są raporty komunikatów cucumber.

Możesz generować raporty cucumber message poprzez skonfigurowanie opcji format w cucumberOpts. Zdecydowanie zaleca się podanie dynamicznej nazwy pliku w opcji formatu cucumber message, aby zapobiec nadpisywaniu raportów i zapewnić dokładne rejestrowanie każdego przebiegu testu.

Przed użyciem tej funkcji upewnij się, że ustawione są następujące zmienne środowiskowe:

  • CUCUMBER_PUBLISH_REPORT_URL: URL, pod którym chcesz opublikować raport Cucumber. Jeśli nie podano, zostanie użyty domyślny URL 'https://messages.cucumber.io/api/reports'.
  • CUCUMBER_PUBLISH_REPORT_TOKEN: Token autoryzacyjny wymagany do publikacji raportu. Jeśli ten token nie jest ustawiony, funkcja zakończy działanie bez publikowania raportu.

Oto przykład niezbędnych konfiguracji i przykładów kodu do implementacji:

import { v4 as uuidv4 } from 'uuid'
import { publishCucumberReport } from '@wdio/cucumber-framework';

export const config = {
// ... Inne opcje konfiguracyjne
cucumberOpts: {
// ... Konfiguracja opcji Cucumber
format: [
['message', `./reports/${uuidv4()}.ndjson`],
['json', './reports/test-report.json']
]
},
async onComplete() {
await publishCucumberReport('./reports');
}
}

Proszę zauważyć, że ./reports/ to katalog, w którym będą przechowywane raporty cucumber message.

Używanie Serenity/JS

Serenity/JS to framework open-source zaprojektowany, aby uczynić testowanie akceptacyjne i regresyjne złożonych systemów oprogramowania szybszym, bardziej współpracującym i łatwiejszym do skalowania.

Dla zestawów testowych WebdriverIO, Serenity/JS oferuje:

Serenity BDD Report Example

Instalacja Serenity/JS

Aby dodać Serenity/JS do istniejącego projektu WebdriverIO, zainstaluj następujące moduły Serenity/JS z NPM:

npm install @serenity-js/{core,web,webdriverio,assertions,console-reporter,serenity-bdd} --save-dev

Dowiedz się więcej o modułach Serenity/JS:

Konfiguracja Serenity/JS

Aby włączyć integrację z Serenity/JS, skonfiguruj WebdriverIO w następujący sposób:

wdio.conf.ts
import { WebdriverIOConfig } from '@serenity-js/webdriverio';

export const config: WebdriverIOConfig = {

// Tell WebdriverIO to use Serenity/JS framework
framework: '@serenity-js/webdriverio',

// Serenity/JS configuration
serenity: {
// Configure Serenity/JS to use the appropriate adapter for your test runner
runner: 'cucumber',
// runner: 'mocha',
// runner: 'jasmine',

// Register Serenity/JS reporting services, a.k.a. the "stage crew"
crew: [
// Optional, print test execution results to standard output
'@serenity-js/console-reporter',

// Optional, produce Serenity BDD reports and living documentation (HTML)
'@serenity-js/serenity-bdd',
[ '@serenity-js/core:ArtifactArchiver', { outputDirectory: 'target/site/serenity' } ],

// Optional, automatically capture screenshots upon interaction failure
[ '@serenity-js/web:Photographer', { strategy: 'TakePhotosOfFailures' } ],
]
},

// Configure your Cucumber runner
cucumberOpts: {
// see Cucumber configuration options below
},


// ... or Jasmine runner
jasmineOpts: {
// see Jasmine configuration options below
},

// ... or Mocha runner
mochaOpts: {
// see Mocha configuration options below
},

runner: 'local',

// Any other WebdriverIO configuration
};

Dowiedz się więcej o:

Tworzenie raportów Serenity BDD i żywej dokumentacji

Raporty Serenity BDD i żywa dokumentacja są generowane przez Serenity BDD CLI, program Java pobierany i zarządzany przez moduł @serenity-js/serenity-bdd.

Aby tworzyć raporty Serenity BDD, twój zestaw testowy musi:

  • pobrać Serenity BDD CLI, wywołując serenity-bdd update, co lokalnie buforuje CLI jar
  • tworzyć pośrednie raporty Serenity BDD .json, rejestrując SerenityBDDReporter zgodnie z instrukcjami konfiguracji
  • wywołać Serenity BDD CLI, gdy chcesz wygenerować raport, wywołując serenity-bdd run

Wzorzec używany przez wszystkie szablony projektów Serenity/JS opiera się na użyciu:

  • skryptu NPM postinstall do pobrania Serenity BDD CLI
  • npm-failsafe do uruchamiania procesu raportowania nawet jeśli sam zestaw testowy zakończył się niepowodzeniem (co jest dokładnie tym momentem, kiedy najbardziej potrzebujesz raportów testowych...).
  • rimraf jako wygodnej metody do usuwania raportów testów pozostałych z poprzedniego uruchomienia
package.json
{
"scripts": {
"postinstall": "serenity-bdd update",
"clean": "rimraf target",
"test": "failsafe clean test:execute test:report",
"test:execute": "wdio wdio.conf.ts",
"test:report": "serenity-bdd run"
}
}

Aby dowiedzieć się więcej o SerenityBDDReporter, zapoznaj się z:

Używanie API wzorca Screenplay w Serenity/JS

Wzorzec Screenplay to innowacyjne, skoncentrowane na użytkowniku podejście do pisania wysokiej jakości zautomatyzowanych testów akceptacyjnych. Kieruje Cię w kierunku efektywnego wykorzystania warstw abstrakcji, pomaga Twoim scenariuszom testowym uchwycić biznesowy żargon Twojej domeny i zachęca do dobrych nawyków w testowaniu i inżynierii oprogramowania w Twoim zespole.

Domyślnie, gdy rejestrujesz @serenity-js/webdriverio jako swój framework WebdriverIO, Serenity/JS konfiguruje domyślną obsadę aktorów, gdzie każdy aktor może:

Powinno to wystarczyć, aby pomóc Ci rozpocząć wprowadzanie scenariuszy testowych, które podążają za wzorcem Screenplay, nawet do istniejącego zestawu testów, na przykład:

specs/example.spec.ts
import { actorCalled } from '@serenity-js/core'
import { Navigate, Page } from '@serenity-js/web'
import { Ensure, equals } from '@serenity-js/assertions'

describe('My awesome website', () => {
it('can have test scenarios that follow the Screenplay Pattern', async () => {
await actorCalled('Alice').attemptsTo(
Navigate.to(`https://webdriver.io`),
Ensure.that(
Page.current().title(),
equals(`WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO`)
),
)
})

it('can have non-Screenplay scenarios too', async () => {
await browser.url('https://webdriver.io')
await expect(browser)
.toHaveTitle('WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO')
})
})

Aby dowiedzieć się więcej o wzorcu Screenplay, sprawdź:

Welcome! How can I help?

WebdriverIO AI Copilot