codeceptjs 3.5.12-beta.1 → 3.5.12-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/advanced.md +351 -0
- package/docs/ai.md +248 -0
- package/docs/api.md +323 -0
- package/docs/basics.md +979 -0
- package/docs/bdd.md +539 -0
- package/docs/best.md +237 -0
- package/docs/books.md +37 -0
- package/docs/bootstrap.md +135 -0
- package/docs/build/ApiDataFactory.js +410 -0
- package/docs/build/Appium.js +2027 -0
- package/docs/build/Expect.js +422 -0
- package/docs/build/FileSystem.js +228 -0
- package/docs/build/GraphQL.js +229 -0
- package/docs/build/GraphQLDataFactory.js +309 -0
- package/docs/build/JSONResponse.js +338 -0
- package/docs/build/Mochawesome.js +71 -0
- package/docs/build/Nightmare.js +2152 -0
- package/docs/build/OpenAI.js +126 -0
- package/docs/build/Playwright.js +5110 -0
- package/docs/build/Protractor.js +2706 -0
- package/docs/build/Puppeteer.js +3905 -0
- package/docs/build/REST.js +344 -0
- package/docs/build/TestCafe.js +2125 -0
- package/docs/build/WebDriver.js +4240 -0
- package/docs/changelog.md +2572 -0
- package/docs/commands.md +266 -0
- package/docs/community-helpers.md +58 -0
- package/docs/configuration.md +157 -0
- package/docs/continuous-integration.md +22 -0
- package/docs/custom-helpers.md +306 -0
- package/docs/data.md +379 -0
- package/docs/detox.md +235 -0
- package/docs/docker.md +136 -0
- package/docs/email.md +183 -0
- package/docs/examples.md +149 -0
- package/docs/helpers/ApiDataFactory.md +266 -0
- package/docs/helpers/Appium.md +1374 -0
- package/docs/helpers/Detox.md +586 -0
- package/docs/helpers/Expect.md +275 -0
- package/docs/helpers/FileSystem.md +152 -0
- package/docs/helpers/GraphQL.md +151 -0
- package/docs/helpers/GraphQLDataFactory.md +226 -0
- package/docs/helpers/JSONResponse.md +254 -0
- package/docs/helpers/Mochawesome.md +8 -0
- package/docs/helpers/MockRequest.md +377 -0
- package/docs/helpers/Nightmare.md +1305 -0
- package/docs/helpers/OpenAI.md +70 -0
- package/docs/helpers/Playwright.md +2759 -0
- package/docs/helpers/Polly.md +44 -0
- package/docs/helpers/Protractor.md +1769 -0
- package/docs/helpers/Puppeteer-firefox.md +86 -0
- package/docs/helpers/Puppeteer.md +2317 -0
- package/docs/helpers/REST.md +218 -0
- package/docs/helpers/TestCafe.md +1321 -0
- package/docs/helpers/WebDriver.md +2547 -0
- package/docs/hooks.md +340 -0
- package/docs/index.md +111 -0
- package/docs/installation.md +75 -0
- package/docs/internal-api.md +266 -0
- package/docs/locators.md +339 -0
- package/docs/mobile-react-native-locators.md +67 -0
- package/docs/mobile.md +338 -0
- package/docs/pageobjects.md +291 -0
- package/docs/parallel.md +400 -0
- package/docs/playwright.md +632 -0
- package/docs/plugins.md +1259 -0
- package/docs/puppeteer.md +316 -0
- package/docs/quickstart.md +162 -0
- package/docs/react.md +70 -0
- package/docs/reports.md +392 -0
- package/docs/secrets.md +36 -0
- package/docs/shadow.md +68 -0
- package/docs/shared/keys.mustache +31 -0
- package/docs/shared/react.mustache +1 -0
- package/docs/testcafe.md +174 -0
- package/docs/translation.md +247 -0
- package/docs/tutorial.md +271 -0
- package/docs/typescript.md +180 -0
- package/docs/ui.md +59 -0
- package/docs/videos.md +28 -0
- package/docs/visual.md +202 -0
- package/docs/vue.md +143 -0
- package/docs/webapi/amOnPage.mustache +11 -0
- package/docs/webapi/appendField.mustache +11 -0
- package/docs/webapi/attachFile.mustache +12 -0
- package/docs/webapi/blur.mustache +18 -0
- package/docs/webapi/checkOption.mustache +13 -0
- package/docs/webapi/clearCookie.mustache +9 -0
- package/docs/webapi/clearField.mustache +9 -0
- package/docs/webapi/click.mustache +25 -0
- package/docs/webapi/clickLink.mustache +8 -0
- package/docs/webapi/closeCurrentTab.mustache +7 -0
- package/docs/webapi/closeOtherTabs.mustache +8 -0
- package/docs/webapi/dontSee.mustache +11 -0
- package/docs/webapi/dontSeeCheckboxIsChecked.mustache +10 -0
- package/docs/webapi/dontSeeCookie.mustache +8 -0
- package/docs/webapi/dontSeeCurrentUrlEquals.mustache +10 -0
- package/docs/webapi/dontSeeElement.mustache +8 -0
- package/docs/webapi/dontSeeElementInDOM.mustache +8 -0
- package/docs/webapi/dontSeeInCurrentUrl.mustache +4 -0
- package/docs/webapi/dontSeeInField.mustache +11 -0
- package/docs/webapi/dontSeeInSource.mustache +8 -0
- package/docs/webapi/dontSeeInTitle.mustache +8 -0
- package/docs/webapi/doubleClick.mustache +13 -0
- package/docs/webapi/downloadFile.mustache +12 -0
- package/docs/webapi/dragAndDrop.mustache +9 -0
- package/docs/webapi/dragSlider.mustache +11 -0
- package/docs/webapi/executeAsyncScript.mustache +24 -0
- package/docs/webapi/executeScript.mustache +26 -0
- package/docs/webapi/fillField.mustache +16 -0
- package/docs/webapi/focus.mustache +13 -0
- package/docs/webapi/forceClick.mustache +28 -0
- package/docs/webapi/forceRightClick.mustache +18 -0
- package/docs/webapi/grabAllWindowHandles.mustache +7 -0
- package/docs/webapi/grabAttributeFrom.mustache +10 -0
- package/docs/webapi/grabAttributeFromAll.mustache +9 -0
- package/docs/webapi/grabBrowserLogs.mustache +9 -0
- package/docs/webapi/grabCookie.mustache +11 -0
- package/docs/webapi/grabCssPropertyFrom.mustache +11 -0
- package/docs/webapi/grabCssPropertyFromAll.mustache +10 -0
- package/docs/webapi/grabCurrentUrl.mustache +9 -0
- package/docs/webapi/grabCurrentWindowHandle.mustache +6 -0
- package/docs/webapi/grabDataFromPerformanceTiming.mustache +20 -0
- package/docs/webapi/grabElementBoundingRect.mustache +20 -0
- package/docs/webapi/grabGeoLocation.mustache +8 -0
- package/docs/webapi/grabHTMLFrom.mustache +10 -0
- package/docs/webapi/grabHTMLFromAll.mustache +9 -0
- package/docs/webapi/grabNumberOfOpenTabs.mustache +8 -0
- package/docs/webapi/grabNumberOfVisibleElements.mustache +9 -0
- package/docs/webapi/grabPageScrollPosition.mustache +8 -0
- package/docs/webapi/grabPopupText.mustache +5 -0
- package/docs/webapi/grabSource.mustache +8 -0
- package/docs/webapi/grabTextFrom.mustache +10 -0
- package/docs/webapi/grabTextFromAll.mustache +9 -0
- package/docs/webapi/grabTitle.mustache +8 -0
- package/docs/webapi/grabValueFrom.mustache +9 -0
- package/docs/webapi/grabValueFromAll.mustache +8 -0
- package/docs/webapi/grabWebElement.mustache +9 -0
- package/docs/webapi/grabWebElements.mustache +9 -0
- package/docs/webapi/moveCursorTo.mustache +12 -0
- package/docs/webapi/openNewTab.mustache +7 -0
- package/docs/webapi/pressKey.mustache +12 -0
- package/docs/webapi/pressKeyDown.mustache +12 -0
- package/docs/webapi/pressKeyUp.mustache +12 -0
- package/docs/webapi/pressKeyWithKeyNormalization.mustache +60 -0
- package/docs/webapi/refreshPage.mustache +6 -0
- package/docs/webapi/resizeWindow.mustache +6 -0
- package/docs/webapi/rightClick.mustache +14 -0
- package/docs/webapi/saveElementScreenshot.mustache +10 -0
- package/docs/webapi/saveScreenshot.mustache +12 -0
- package/docs/webapi/say.mustache +10 -0
- package/docs/webapi/scrollIntoView.mustache +11 -0
- package/docs/webapi/scrollPageToBottom.mustache +6 -0
- package/docs/webapi/scrollPageToTop.mustache +6 -0
- package/docs/webapi/scrollTo.mustache +12 -0
- package/docs/webapi/see.mustache +11 -0
- package/docs/webapi/seeAttributesOnElements.mustache +9 -0
- package/docs/webapi/seeCheckboxIsChecked.mustache +10 -0
- package/docs/webapi/seeCookie.mustache +8 -0
- package/docs/webapi/seeCssPropertiesOnElements.mustache +9 -0
- package/docs/webapi/seeCurrentUrlEquals.mustache +11 -0
- package/docs/webapi/seeElement.mustache +8 -0
- package/docs/webapi/seeElementInDOM.mustache +8 -0
- package/docs/webapi/seeInCurrentUrl.mustache +8 -0
- package/docs/webapi/seeInField.mustache +12 -0
- package/docs/webapi/seeInPopup.mustache +8 -0
- package/docs/webapi/seeInSource.mustache +7 -0
- package/docs/webapi/seeInTitle.mustache +8 -0
- package/docs/webapi/seeNumberOfElements.mustache +11 -0
- package/docs/webapi/seeNumberOfVisibleElements.mustache +10 -0
- package/docs/webapi/seeTextEquals.mustache +9 -0
- package/docs/webapi/seeTitleEquals.mustache +8 -0
- package/docs/webapi/selectOption.mustache +21 -0
- package/docs/webapi/setCookie.mustache +16 -0
- package/docs/webapi/setGeoLocation.mustache +12 -0
- package/docs/webapi/switchTo.mustache +9 -0
- package/docs/webapi/switchToNextTab.mustache +10 -0
- package/docs/webapi/switchToPreviousTab.mustache +10 -0
- package/docs/webapi/type.mustache +21 -0
- package/docs/webapi/uncheckOption.mustache +13 -0
- package/docs/webapi/wait.mustache +8 -0
- package/docs/webapi/waitForClickable.mustache +11 -0
- package/docs/webapi/waitForDetached.mustache +10 -0
- package/docs/webapi/waitForElement.mustache +11 -0
- package/docs/webapi/waitForEnabled.mustache +6 -0
- package/docs/webapi/waitForFunction.mustache +17 -0
- package/docs/webapi/waitForInvisible.mustache +10 -0
- package/docs/webapi/waitForNumberOfTabs.mustache +9 -0
- package/docs/webapi/waitForText.mustache +13 -0
- package/docs/webapi/waitForValue.mustache +10 -0
- package/docs/webapi/waitForVisible.mustache +10 -0
- package/docs/webapi/waitInUrl.mustache +9 -0
- package/docs/webapi/waitNumberOfVisibleElements.mustache +10 -0
- package/docs/webapi/waitToHide.mustache +10 -0
- package/docs/webapi/waitUrlEquals.mustache +10 -0
- package/docs/webdriver.md +701 -0
- package/docs/wiki/Books-&-Posts.md +27 -0
- package/docs/wiki/Community-Helpers-&-Plugins.md +53 -0
- package/docs/wiki/Converting-Playwright-to-Istanbul-Coverage.md +61 -0
- package/docs/wiki/Examples.md +145 -0
- package/docs/wiki/Google-Summer-of-Code-(GSoC)-2020.md +68 -0
- package/docs/wiki/Home.md +16 -0
- package/docs/wiki/Migration-to-Appium-v2---CodeceptJS.md +83 -0
- package/docs/wiki/Release-Process.md +24 -0
- package/docs/wiki/Roadmap.md +23 -0
- package/docs/wiki/Tests.md +1393 -0
- package/docs/wiki/Upgrading-to-CodeceptJS-3.md +153 -0
- package/docs/wiki/Videos.md +19 -0
- package/lib/css2xpath/js/css_to_xpath.js +20 -0
- package/lib/css2xpath/js/expression.js +23 -0
- package/lib/css2xpath/js/renderer.js +239 -0
- package/lib/locator.js +15 -1
- package/package.json +12 -9
package/docs/detox.md
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
---
|
|
2
|
+
permalink: /detox
|
|
3
|
+
title: Testing React Native with Detox
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> Warning! Detox support in CodeceptJS is experimental. Please try it and help us to test it and improve it. [See Detox helper repository](https://github.com/codeceptjs/detox-helper).
|
|
7
|
+
|
|
8
|
+
Automated mobile testing can be slow, hard, and ineffective. The price of it goes high, if we take into account fragility of applications, slowness of emulators, and the complexity of debug. [Appium](/mobile) helps writing mobile tests but not all apps can be tested effectively with it. That's why you should consider using an alternative approach.
|
|
9
|
+
|
|
10
|
+
Meet [Detox](https://github.com/wix/Detox) - grey-box testing solution for mobile testing by Wix.
|
|
11
|
+
|
|
12
|
+
Unlike, Appium, Detox requires to update mobile application to include test instrumentation, so an application could receive commands from a test, and act accordingly. Let's see pros and cons of such approach:
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
**Pros**:
|
|
16
|
+
|
|
17
|
+
* faster tests
|
|
18
|
+
* synchronization with application
|
|
19
|
+
* plays nicely with React Native
|
|
20
|
+
|
|
21
|
+
**Cons**:
|
|
22
|
+
|
|
23
|
+
* application should be built in a special way
|
|
24
|
+
* no hybrid applications
|
|
25
|
+
* native Android apps not supported (except React Native)
|
|
26
|
+
* no cloud testing with SauceLabs or BrowserStack
|
|
27
|
+
|
|
28
|
+
CodeceptJS allows you to try different options and choose the one which works best for you. Both Appium and Detox helpers share the same syntax for testing mobile applications, interactive pause, automatic retries, and other useful features.
|
|
29
|
+
|
|
30
|
+
CodeceptJS provides next features over standard Detox:
|
|
31
|
+
|
|
32
|
+
* **Unified API**. The same test can be executed in Appium or Detox. Unified API helps different teams to use the same syntax and easy port tests from one engine to another.
|
|
33
|
+
* [Interactive pause](/basics#pause). When starting/stopping an application takes a long time, debugging and writing tests can be hard. CodeceptJS solves this by pausing an execution and letting you try different commands and locators. With this feature a test can be writtern during one running session.
|
|
34
|
+
* [Auto-retries](/basics#retries) using `retryFailedStepPlugin` and `I.retry()`
|
|
35
|
+
* **Cross-Platform testing** - one test can be executed on different engines. When needed, platform-specific actions and locators can be easily applied.
|
|
36
|
+
|
|
37
|
+
## A Test
|
|
38
|
+
|
|
39
|
+
Compare a test written for Detox using its native syntax:
|
|
40
|
+
|
|
41
|
+
```js
|
|
42
|
+
await expect(element(by.text('Welcome'))).toBeVisible();
|
|
43
|
+
await expect(element(by.id('createdAndVisibleText'))).toNotExist();
|
|
44
|
+
await element(by.id('GoButton')).tap();
|
|
45
|
+
await waitFor(element(by.id('createdAndVisibleText'))).toExist().withTimeout(20000);
|
|
46
|
+
await expect(element(by.id('createdAndVisibleText'))).toExist();
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
with the same test written using CodeceptJS syntax:
|
|
50
|
+
|
|
51
|
+
```js
|
|
52
|
+
I.see('Welcome');
|
|
53
|
+
I.dontSeeElement('#createdAndVisibleText');
|
|
54
|
+
I.click('#GoButton');
|
|
55
|
+
I.waitForElement('#createdAndVisibleText', 20);
|
|
56
|
+
I.seeElement('#createdAndVisibleText');
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
As you see, CodeceptJS test is shorter and easier to follow. By simplifying the code and reducing visual noise we make tests easier to follow. But before writing a test we need to prepare an application to be testable with Detox.
|
|
60
|
+
|
|
61
|
+
## Setup
|
|
62
|
+
|
|
63
|
+
It is important to follow [Detox guide](https://github.com/wix/Detox/blob/master/docs/Introduction.GettingStarted.md) to build an application with Detox test instrouments included.
|
|
64
|
+
|
|
65
|
+
After you install Detox, create configuration and build an application using `detox build` command, you are ready to integrate Detox with CodeceptJS.
|
|
66
|
+
|
|
67
|
+
You need to install Detox CodeceptJS helper:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
npm i @codeceptjs/detox-helper --save-dev
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then enable this helper in `codecept.conf.js`:
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
helpers: {
|
|
77
|
+
Detox: {
|
|
78
|
+
require: '@codeceptjs/detox-helper',
|
|
79
|
+
configuration: '<detox app configuration name>',
|
|
80
|
+
reloadReactNative: true,
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Enable `reloadReactNative: true` if you test React Native application.
|
|
86
|
+
|
|
87
|
+
## Actions
|
|
88
|
+
|
|
89
|
+
Create test as usual, by running command:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
npx codeceptjs gt
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
A test starts when emulator starts and loads an application. So you can begin testing an application.
|
|
96
|
+
|
|
97
|
+
```js
|
|
98
|
+
// inside a created test
|
|
99
|
+
Scenario('test React Native app', ({ I }) => {
|
|
100
|
+
I.see('Welcome');
|
|
101
|
+
I.tap('Start');
|
|
102
|
+
I.see('Started!');
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The most common actions are:
|
|
107
|
+
|
|
108
|
+
* `tap` (or `click`)
|
|
109
|
+
* `multiTap` - perform multiple taps on element
|
|
110
|
+
* `longPress` - longer press
|
|
111
|
+
* `fillField` - fill in value of text field
|
|
112
|
+
* `clearField` - clear value in text field
|
|
113
|
+
* `appendField` - append value in a field
|
|
114
|
+
* `swipeUp`, `swipeDown`, `swipeLeft`, `swipeRigth`
|
|
115
|
+
|
|
116
|
+
There are also common assertions:
|
|
117
|
+
|
|
118
|
+
* `see` - to check visibility of text
|
|
119
|
+
* `seeElement` - to check visibility of element
|
|
120
|
+
* `seeElementExists` - to check that element exists
|
|
121
|
+
|
|
122
|
+
> For more details on actions refer to the [API reference of Detox helper](https://github.com/codeceptjs/detox-helper#api).
|
|
123
|
+
|
|
124
|
+
## Locators
|
|
125
|
+
|
|
126
|
+
To write a test you need to learn about available locators in Detox.
|
|
127
|
+
Unlike, Appium there are no XPath locators. Possible locators limited to `text`, `id`, `accessibility id`, and element `type`. Thus, again, an application should be prepared for testing, to ensure that all active elements are accessible.
|
|
128
|
+
|
|
129
|
+
Let's see how they can be used:
|
|
130
|
+
|
|
131
|
+
* For **ID locators** use `#` prefix (same as in CSS). Example:
|
|
132
|
+
|
|
133
|
+
```js
|
|
134
|
+
I.seeElement('#WelcomeScreen')
|
|
135
|
+
```
|
|
136
|
+
* For **accessibility ID** use `~` prefix (as in Appium helper). Example:
|
|
137
|
+
|
|
138
|
+
```js
|
|
139
|
+
I.seeElement('~welcome')
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
* Locating elements **by text** requires no prefix, but can be applied only for actions accepting semantic locators.
|
|
143
|
+
|
|
144
|
+
```js
|
|
145
|
+
I.tap('Start')
|
|
146
|
+
I.fillField('Username', 'davert')
|
|
147
|
+
I.clearField('Username')
|
|
148
|
+
I.see('Welcome, davert')
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
* Locating elements **by type** also use no prefix but can be used only where for elements.
|
|
152
|
+
|
|
153
|
+
```js
|
|
154
|
+
I.seeElement('Button')
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Text locators can be combined with others, as methods `tap`, `click` and `see` can receive a second paramater, which defines a context where to perfrom a search.
|
|
158
|
+
|
|
159
|
+
```js
|
|
160
|
+
// tap "Start" inside "#Layout"
|
|
161
|
+
I.tap('Start', '#Layout');
|
|
162
|
+
// see text "Welcome" inside "~msg"
|
|
163
|
+
I.see('Welcome', '~msg');
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Alternatively, you can use specify locator by using *strict locator*, passing an object as a locator:
|
|
167
|
+
|
|
168
|
+
```js
|
|
169
|
+
I.click({ type: 'Button' });
|
|
170
|
+
I.seeElement({ label: 'welcome' });
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
> If you are familiar with Detox API, this is how locators are actually translated: `{label: 'welcome'}` => `by.label('welcome')`.
|
|
174
|
+
|
|
175
|
+
### Cross Platform Testing
|
|
176
|
+
|
|
177
|
+
If element differs on on iOS and Android you can use **cross platform locators**.
|
|
178
|
+
|
|
179
|
+
```js
|
|
180
|
+
// locate element by text on Android
|
|
181
|
+
// locate element by accessibility id on iOS
|
|
182
|
+
I.click({ android: 'Start', ios: '~start' });
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
When application behavior differs on Android and iOS use platform-specific actions:
|
|
186
|
+
|
|
187
|
+
```js
|
|
188
|
+
I.runOnIOS(() => {
|
|
189
|
+
// this will be executed only on IOS
|
|
190
|
+
I.see('Hello iOS');
|
|
191
|
+
});
|
|
192
|
+
I.runOnAndroid(() => {
|
|
193
|
+
// this will be executed only on Android
|
|
194
|
+
I.see('Hello Android');
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Sample Test
|
|
199
|
+
|
|
200
|
+
Finally, you can get a test looking like this
|
|
201
|
+
|
|
202
|
+
```js
|
|
203
|
+
Feature('My Detox App');
|
|
204
|
+
|
|
205
|
+
Scenario('save in application', ({ I }) => {
|
|
206
|
+
I.setLandscapeOrientation();
|
|
207
|
+
I.fillField('#text', 'a new text');
|
|
208
|
+
I.see('a new text', '#textValue');
|
|
209
|
+
I.dontSeeElement('#createdAndVisibleText');
|
|
210
|
+
I.click({ ios: '#GoButton', android: 'Button' });
|
|
211
|
+
I.waitForElement('#createdAndVisibleText', 20);
|
|
212
|
+
I.seeElement('#createdAndVisibleText');
|
|
213
|
+
I.runOnAndroid(() => {
|
|
214
|
+
I.click('Save');
|
|
215
|
+
I.see('Text Saved', '#message');
|
|
216
|
+
});
|
|
217
|
+
I.runOnIOS(() => {
|
|
218
|
+
I.click('SAVE');
|
|
219
|
+
I.see('SAVED!');
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
To execute it use `codeceptjs run` command
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
npx codeceptjs run
|
|
228
|
+
```
|
|
229
|
+
If you want to use detox configuration other than is set in `codecept.conf.js` use `--configuration` argument:
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
npx codeceptjs run --configuration android.test.ci
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
You can also pass all [other arguments that Detox CLI supports](https://github.com/wix/Detox/blob/master/docs/APIRef.DetoxCLI.md#test).
|
package/docs/docker.md
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Codeceptjs Docker
|
|
2
|
+
|
|
3
|
+
CodeceptJS has an [official docker image](https://hub.docker.com/r/codeceptjs/codeceptjs) based on Playwright image. Image supports Playwright, Puppeteer, and WebDriver engines.
|
|
4
|
+
|
|
5
|
+
## How to Use
|
|
6
|
+
|
|
7
|
+
This image comes with the necessary dependencies and packages to execute CodeceptJS tests.
|
|
8
|
+
Mount in your CodeceptJS config directory into the `/tests` directory in the docker container.
|
|
9
|
+
|
|
10
|
+
Sample mount: `-v path/to/codecept.conf.js:/tests`
|
|
11
|
+
|
|
12
|
+
CodeceptJS runner is available inside container as `codeceptjs`.
|
|
13
|
+
|
|
14
|
+
### Locally
|
|
15
|
+
|
|
16
|
+
You can execute CodeceptJS with Puppeteer locally with no extra configuration.
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
docker run --net=host -v $PWD:/tests codeceptjs/codeceptjs
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
To customize execution call `codeceptjs` command:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
# run tests with steps
|
|
26
|
+
docker run --net=host -v $PWD:/tests codeceptjs/codeceptjs codeceptjs run --steps
|
|
27
|
+
|
|
28
|
+
# run tests with @user in a name
|
|
29
|
+
docker run --net=host -v $PWD:/tests codeceptjs/codeceptjs codeceptjs run --grep "@user"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### Docker Compose
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
version: '2'
|
|
37
|
+
services:
|
|
38
|
+
codeceptjs:
|
|
39
|
+
image: codeceptjs/codeceptjs
|
|
40
|
+
depends_on:
|
|
41
|
+
- firefox
|
|
42
|
+
- web
|
|
43
|
+
volumes:
|
|
44
|
+
- .:/tests
|
|
45
|
+
web:
|
|
46
|
+
image: node
|
|
47
|
+
command: node app/server.js
|
|
48
|
+
volumes:
|
|
49
|
+
- .:/app
|
|
50
|
+
firefox:
|
|
51
|
+
image: selenium/standalone-firefox-debug:2.53.0
|
|
52
|
+
ports:
|
|
53
|
+
- '4444'
|
|
54
|
+
- '5900'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Linking Containers
|
|
58
|
+
|
|
59
|
+
If using the WebDriver driver, link the container with a Selenium Standalone docker container with an alias of `selenium`. Additionally, make sure your `codeceptjs.conf.js` contains the following to allow CodeceptJS to identify where Selenium is running.
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
...
|
|
63
|
+
helpers: {
|
|
64
|
+
WebDriver: {
|
|
65
|
+
...
|
|
66
|
+
host: process.env.HOST
|
|
67
|
+
...
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
...
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
$ docker run -d -P --name selenium-chrome selenium/standalone-chrome
|
|
75
|
+
|
|
76
|
+
# Alternatively, selenium/standalone-firefox can be used
|
|
77
|
+
|
|
78
|
+
$ docker run -it --rm -v /<path_to_codeceptjs_test_dir>/:/tests/ --link selenium-chrome:selenium codeceptjs/codeceptjs
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
You may run use `-v $(pwd)/:tests/` if running this from the root of your CodeceptJS tests directory.
|
|
82
|
+
_Note: The output of your test run will appear in your local directory if your output path is `./output` in the CodeceptJS config_
|
|
83
|
+
|
|
84
|
+
### Build
|
|
85
|
+
|
|
86
|
+
To build this image:
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
docker build -t codeceptjs/codeceptjs .
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
* this directory will be added as `/codecept` insde container
|
|
93
|
+
* tests directory is expected to be mounted as `/tests`
|
|
94
|
+
* `codeceptjs` is a synlink to `/codecept/bin/codecept.js`
|
|
95
|
+
|
|
96
|
+
To build this image with your desired Node version:
|
|
97
|
+
|
|
98
|
+
```sh
|
|
99
|
+
docker build -t codeceptjs/codeceptjs . --build-arg NODE_VERSION=12.10.0
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Passing Options
|
|
103
|
+
|
|
104
|
+
Options can be passed by calling `codeceptjs`:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
docker run -v $PWD:/tests codeceptjs/codeceptjs codeceptjs run --debug
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Alternatively arguments to `codecept run` command can be passed via `CODECEPT_ARGS` environment variable. For example to run your tests with debug
|
|
111
|
+
output:
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
version: '2'
|
|
115
|
+
services:
|
|
116
|
+
codeceptjs:
|
|
117
|
+
image: codeceptjs/codeceptjs
|
|
118
|
+
environment:
|
|
119
|
+
- CODECEPT_ARGS=--debug
|
|
120
|
+
volumes:
|
|
121
|
+
- .:/tests
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
You can also use `run-workers`to run tests by passing `NO_OF_WORKERS`, additionally, you can pass more params like showing the debug info as the following example:
|
|
125
|
+
|
|
126
|
+
```yaml
|
|
127
|
+
version: '2'
|
|
128
|
+
services:
|
|
129
|
+
codeceptjs:
|
|
130
|
+
image: codeceptjs/codeceptjs
|
|
131
|
+
environment:
|
|
132
|
+
- NO_OF_WORKERS=3
|
|
133
|
+
- CODECEPT_ARGS=--debug
|
|
134
|
+
volumes:
|
|
135
|
+
- .:/tests
|
|
136
|
+
```
|
package/docs/email.md
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
permalink: /email
|
|
3
|
+
title: Email Testing
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Email Testing
|
|
7
|
+
|
|
8
|
+
In End 2 End testing we need to interact with emails.
|
|
9
|
+
Email delivery can't be tested locally or mocked while testing.
|
|
10
|
+
That's why for an end to end test you need real emails to be sent and real email address to receive that emails.
|
|
11
|
+
|
|
12
|
+
Setting up an email server can be hard. So we recommend to use [MailSlurp](https://mailslurp.com/) - a service designed for testing emails. It creates disposable mailboxes and provides you an access to those mailboxes via REST API.
|
|
13
|
+
|
|
14
|
+
> You no longer need to open your gmail account in a browser to check for an email!
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
MailSlurp is a commercial service with a free plan available. To start, [create an account at MailSlurp](https://app.mailslurp.com/) and receive API key to use it. Once received install mailslurp helper from npm:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
npm i @codeceptjs/mailslurp-helper --save-dev
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Then enable a helper in `codecept.conf.js`:
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
helpers: {
|
|
28
|
+
|
|
29
|
+
MailSlurp: {
|
|
30
|
+
require: '@codeceptjs/mailslurp-helper',
|
|
31
|
+
apiKey: '<apiKeyFromMailSlurp>'
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
After a helper is added, regenerate TypeScript definitions for auto-completion support:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
npx codeceptjs def
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Creating Mailbox
|
|
43
|
+
|
|
44
|
+
MailSlurp allows you to create disposable mailboxes. It means that an email address is created for one test only and is deleted afterwards. So you can be confident that no other emails are received at that address.
|
|
45
|
+
|
|
46
|
+
To create a mailbox use `I.haveNewMailbox()` command:
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
// inside async/await function
|
|
50
|
+
const mailbox = await I.haveNewMailbox();
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
mailbox object contains:
|
|
54
|
+
|
|
55
|
+
* `id` - which is used in next commands
|
|
56
|
+
* `emailAddress` - randomly generated address of a created mailbox.
|
|
57
|
+
|
|
58
|
+
> See [MailSlurp's guide](https://www.mailslurp.com/guides/getting-started/#create-email-addresses) for details.
|
|
59
|
+
|
|
60
|
+
Mailbox is opened on creation. If you need more than one mailbox and you want to switch between them use `openMailbox` method:
|
|
61
|
+
|
|
62
|
+
```js
|
|
63
|
+
const mailbox1 = await I.haveNewMailbox();
|
|
64
|
+
const mailbox2 = await I.haveNewMailbox();
|
|
65
|
+
// mailbox2 is now default mailbox
|
|
66
|
+
// switch back to mailbox1
|
|
67
|
+
I.openMailbox(mailbox1);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Receiving An Email
|
|
71
|
+
|
|
72
|
+
A last created mailbox will be activated. It means that it will be used by default to check for emails.
|
|
73
|
+
|
|
74
|
+
After an action that triggers sending an email is performed on a website, you should wait for this email to be received.
|
|
75
|
+
A timeout for waiting an email can be set globally for a helper or for a one call.
|
|
76
|
+
|
|
77
|
+
Use `waitForLatestEmail` function to return the first email from a mailbox:
|
|
78
|
+
|
|
79
|
+
```js
|
|
80
|
+
// to wait for default time (10 secs by default)
|
|
81
|
+
I.waitForLatestEmail();
|
|
82
|
+
|
|
83
|
+
// or specify number of time to wait
|
|
84
|
+
I.waitForLatestEmail(30);
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
To specify the exact email to match use `waitForEmailMatching` function:
|
|
88
|
+
|
|
89
|
+
```js
|
|
90
|
+
// wait for an email with partial match in subject
|
|
91
|
+
I.waitForEmailMatching({ subject: 'Restore password' });
|
|
92
|
+
|
|
93
|
+
// wait 30 seconds for email with exact subject
|
|
94
|
+
I.waitForEmailMatching({ subject: '=Forgot password' }, 30);
|
|
95
|
+
|
|
96
|
+
// wait a last email from any address @mysite.com
|
|
97
|
+
I.waitForEmailMatching({
|
|
98
|
+
from: '@mysite.com', // find anything from mysite
|
|
99
|
+
subject: 'Restore password', // with Restore password in subject
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Opening An Email
|
|
104
|
+
|
|
105
|
+
All wait* functions return a matched email as a result. So you can use it in a test:
|
|
106
|
+
|
|
107
|
+
```js
|
|
108
|
+
const email = await I.waitForLatestEmail();
|
|
109
|
+
```
|
|
110
|
+
> Please note, that we use `await` to assign email. This should be declared inside async function
|
|
111
|
+
|
|
112
|
+
An `email` object contains the following fields:
|
|
113
|
+
|
|
114
|
+
* `subject`
|
|
115
|
+
* `for`
|
|
116
|
+
* `to`
|
|
117
|
+
* `body`
|
|
118
|
+
|
|
119
|
+
So you can analyze them inside a test. For instance, you can extract an URL from email body and open it.
|
|
120
|
+
This is how we can emulate "click on this link" behavior in email:
|
|
121
|
+
|
|
122
|
+
```js
|
|
123
|
+
// clicking a link in email
|
|
124
|
+
const email = await I.waitForLatestEmail();
|
|
125
|
+
// extract a link by RegExp
|
|
126
|
+
const url = email.body.match(/http(s):\/\/(.*?)\s/)[0];
|
|
127
|
+
// open URL
|
|
128
|
+
I.amOnPage(url);
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Assertions
|
|
132
|
+
|
|
133
|
+
Assertions are performed on the currently opened email. Email is opened on `waitFor` email call, however, you can open an exact email by using `openEmail` function.
|
|
134
|
+
|
|
135
|
+
```js
|
|
136
|
+
const email1 = await I.waitForLatestEmail();
|
|
137
|
+
// test proceeds...
|
|
138
|
+
const email2 = await I.waitForLatestEmail();
|
|
139
|
+
I.openEmail(email1); // open previous email
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
After opening an email assertion methods are available.
|
|
143
|
+
|
|
144
|
+
* `seeInEmailSubject`
|
|
145
|
+
* `seeEmailIsFrom`
|
|
146
|
+
* `seeInEmailBody`
|
|
147
|
+
* `dontSeeInEmailBody`
|
|
148
|
+
* `seeNumberOfEmailAttachments`
|
|
149
|
+
* `seeEmailAttachment`
|
|
150
|
+
|
|
151
|
+
And here is an example of their usage:
|
|
152
|
+
|
|
153
|
+
```js
|
|
154
|
+
I.waitForLatestEmail()
|
|
155
|
+
I.seeEmailIsFrom('@mysite.com');
|
|
156
|
+
I.seeInEmailSubject('Awesome Proposal!');
|
|
157
|
+
I.seeInEmailBody('To unsubscribe click here');
|
|
158
|
+
I.seeNumberOfEmailAttachments(2);
|
|
159
|
+
I.seeEmailAttachment('Attachment_1.pdf')
|
|
160
|
+
I.seeEmailAttachment('Attachment_2.pdf')
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
> More methods are listed in [helper's API reference](https://github.com/codeceptjs/mailslurp-helper/blob/master/README.md#api)
|
|
164
|
+
|
|
165
|
+
## Listing All Emails
|
|
166
|
+
|
|
167
|
+
Use `grabAllEmailsFromMailbox` to get all emails from a current mailbox:
|
|
168
|
+
|
|
169
|
+
```js
|
|
170
|
+
const emails = await I.grabAllEmailsFromMailbox();
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Sending an Email
|
|
174
|
+
|
|
175
|
+
You can also send an email from an active mailbox:
|
|
176
|
+
|
|
177
|
+
```js
|
|
178
|
+
I.sendEmail({
|
|
179
|
+
to: ['user@site.com'],
|
|
180
|
+
subject: 'Hello',
|
|
181
|
+
body: 'World'
|
|
182
|
+
});
|
|
183
|
+
```
|
package/docs/examples.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
permalink: /examples
|
|
3
|
+
layout: Section
|
|
4
|
+
sidebar: false
|
|
5
|
+
title: Examples
|
|
6
|
+
editLink: false
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Examples
|
|
10
|
+
> Add your own examples to our [Wiki Page](https://github.com/codeceptjs/CodeceptJS/wiki/Examples)
|
|
11
|
+
## [TodoMVC Examples](https://github.com/codecept-js/examples)
|
|
12
|
+
|
|
13
|
+

|
|
14
|
+
|
|
15
|
+
Playground repository where you can run tests in different helpers on a basic single-page website.
|
|
16
|
+
|
|
17
|
+
Tests repository demonstrate usage of
|
|
18
|
+
|
|
19
|
+
* Puppeteer helper
|
|
20
|
+
* WebDriver helper
|
|
21
|
+
* TestCafe plugin
|
|
22
|
+
* Toggle headless mode with env variables
|
|
23
|
+
* PageObjects
|
|
24
|
+
* Cucumber syntax
|
|
25
|
+
|
|
26
|
+
## [Basic Examples](https://github.com/Codeception/CodeceptJS/tree/master/examples)
|
|
27
|
+
|
|
28
|
+
CodeceptJS repo contains basic tests (both failing and passing) just to show how it works.
|
|
29
|
+
Our team uses it to test new features and run simple scenarios.
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
## [CodeceptJS Cucumber E2E Framework](https://github.com/gkushang/codeceptjs-e2e)
|
|
33
|
+
|
|
34
|
+
This repository contains complete E2E framework for CodeceptJS with Cucumber and SauceLabs Integration
|
|
35
|
+
|
|
36
|
+
* CodecepJS-Cucumber E2E Framework
|
|
37
|
+
* Saucelabs Integration
|
|
38
|
+
* Run Cross Browser tests in Parallel on SauceLabs with a simple command
|
|
39
|
+
* Run tests on `chrome:headless`
|
|
40
|
+
* Page Objects
|
|
41
|
+
* `Should.js` Assertion Library
|
|
42
|
+
* Uses `wdio` service (selenium-standalone, sauce)
|
|
43
|
+
* Allure HTML Reports
|
|
44
|
+
* Uses shared Master configuration
|
|
45
|
+
* Sample example and feature files of GitHub Features
|
|
46
|
+
|
|
47
|
+
## [Enterprise Grade Tests](https://github.com/uc-cdis/gen3-qa)
|
|
48
|
+
|
|
49
|
+
Complex testing solution by [Gen3](https://github.com/uc-cdis/gen3-qa)
|
|
50
|
+
|
|
51
|
+
Includes
|
|
52
|
+
|
|
53
|
+
* classical CodeceptJS tests
|
|
54
|
+
* BDD tests
|
|
55
|
+
* Jenkins integration
|
|
56
|
+
* Complex Before/BeforeSuite scripts and more
|
|
57
|
+
|
|
58
|
+
## [Testing Single Page Application](https://github.com/bugiratracker/codeceptjs-demo)
|
|
59
|
+
|
|
60
|
+
End 2 end tests for Task management app (currently offline).
|
|
61
|
+
|
|
62
|
+
Tests repository demonstrate usage of
|
|
63
|
+
|
|
64
|
+
* Puppeteer helper
|
|
65
|
+
* ApiDataFactory helper
|
|
66
|
+
* autoLogin plugin
|
|
67
|
+
* Dynamic config with profiles
|
|
68
|
+
|
|
69
|
+
## [Practical E2E Tests](https://gitlab.com/paulvincent/codeceptjs-e2e-testing)
|
|
70
|
+
|
|
71
|
+
Examples from the book [Practical End 2 End Testing with CodeceptJS](https://leanpub.com/codeceptjs/) by **Paul Vincent Beigang**.
|
|
72
|
+
|
|
73
|
+
This repository demonstrates usage of:
|
|
74
|
+
|
|
75
|
+
* dynamic config with profiles
|
|
76
|
+
* testing WYSIWYG editor
|
|
77
|
+
* GitLab CI
|
|
78
|
+
|
|
79
|
+
## [Amazon Tests v2](https://gitlab.com/thanhnguyendh/codeceptjs-wdio-services)
|
|
80
|
+
|
|
81
|
+
Testing Amazon website using Selenium WebDriver.
|
|
82
|
+
|
|
83
|
+
This repository demonstrates usage of:
|
|
84
|
+
|
|
85
|
+
* WebDriver helper
|
|
86
|
+
* Page Objects
|
|
87
|
+
* wdio services (selenium-standalone)
|
|
88
|
+
* Parallel execution
|
|
89
|
+
* GitLab CI setup
|
|
90
|
+
|
|
91
|
+
## [Tests with Docker Compose](https://github.com/mathesouza/codeceptjs-docker-compose)
|
|
92
|
+
|
|
93
|
+
Running CodeceptJS tests with Docker Compose
|
|
94
|
+
|
|
95
|
+
This repository demonstrates usage of:
|
|
96
|
+
|
|
97
|
+
* CodeceptJS Docker image
|
|
98
|
+
* WebDriver helper
|
|
99
|
+
* Allure plugin
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
## [AngularJS Example Tests](https://github.com/armno/angular-e2e-codeceptjs-example)
|
|
103
|
+
|
|
104
|
+
Based on [Setting up End-to-End Testing in Angular Project with CodeceptJS](https://medium.com/@armno/setting-up-end-to-end-testing-in-angular-project-with-codeceptjs-ac1784de3420) post by Armno Prommarak.
|
|
105
|
+
|
|
106
|
+
This repository demonstrates usage of
|
|
107
|
+
|
|
108
|
+
* Puppeteer helper
|
|
109
|
+
* Working with Angular CLI
|
|
110
|
+
* Reports with Mochawesome helper
|
|
111
|
+
|
|
112
|
+
## [REST Example Tests](https://github.com/PeterNgTr/codeceptjs-rest-demo)
|
|
113
|
+
|
|
114
|
+
This repository demonstrates usage of
|
|
115
|
+
|
|
116
|
+
* REST helper
|
|
117
|
+
|
|
118
|
+
## [Automation Starter](https://github.com/sjorrillo/automation-starter)
|
|
119
|
+
|
|
120
|
+
The purpose of this application is for learning the basics and how to use good practices and useful tools in automation.
|
|
121
|
+
|
|
122
|
+
* Puppeteer helper
|
|
123
|
+
* Working with gherkin, also it has type definitions and to be able to use them inside when, given and then make sure you add `declare function inject(): { I: CodeceptJS.I, [key: string]: any; };`in the `steps.d.ts`file
|
|
124
|
+
* Linting `airbnb-base`, `codeceptjs/codeceptjs` and full ES6 support
|
|
125
|
+
|
|
126
|
+
## [Example for using: Puppeteer, Gherkin, Allure with parallel execution](https://github.com/SchnuckySchuster/codeceptJSExample)
|
|
127
|
+
|
|
128
|
+
This is a ready to use example that shows how to integrate CodeceptJS with Puppeteer and Allure as reporting tool.
|
|
129
|
+
|
|
130
|
+
* detailed ReadMe
|
|
131
|
+
* tests written in cucumber alongside tests written in the codeceptJS DSL
|
|
132
|
+
* puppeteer helper example
|
|
133
|
+
* test steps, pages, fragments
|
|
134
|
+
* examples for sequential and parallel execution
|
|
135
|
+
* generation of allure test results
|
|
136
|
+
|
|
137
|
+
## [Example for Advanced REST API testing: TypeScript, Axios, CodeceptJS, Jest Expect, Docker, Allure, Mock-Server, Prettier + Eslint, pre-commit, Jest Unit Tests ](https://github.com/EgorBodnar/rest-axios-codeceptjs-allure-docker-test-example)
|
|
138
|
+
One button example with built-in mocked backend.
|
|
139
|
+
|
|
140
|
+
If you already have a UI testing solution based on the CodeceptJS and you need to implement advanced REST API testing you can just extend your existing framework. Use this implementation as an example.
|
|
141
|
+
This is necessary if all integrations with TMS and CI/CD are already configured, and you do not want to reconnect and configure the plugins and libraries used for the new test runner. Use CodeceptJS!
|
|
142
|
+
|
|
143
|
+
* Easy run
|
|
144
|
+
* Detailed README
|
|
145
|
+
* Well documented mocked backend's REST API endpoints
|
|
146
|
+
* HTTP request client with session support and unit tests
|
|
147
|
+
* Exemplary code control
|
|
148
|
+
* Ready to launch in a CI/CD system as is
|
|
149
|
+
* OOP, Test data models and builders, endpoint decorators
|