How to use testSummaries method in qawolf

Best JavaScript code snippet using qawolf

StartupAndTestRecorderPlugin.test.js

Source:StartupAndTestRecorderPlugin.test.js Github

copy

Full Screen

1jest.mock('../../../utils/logger.js');2const StartupAndTestRecorderPlugin = require('./StartupAndTestRecorderPlugin');3const ArtifactsApi = require('./__mocks__/ArtifactsApi.mock');4const testSummaries = require('./__mocks__/testSummaries.mock');5describe('StartupAndTestRecorderPlugin', () => {6 let api;7 let plugin;8 beforeEach(() => {9 api = new ArtifactsApi();10 plugin = new FakeStartupAndTestRecorderPlugin({ api });11 });12 describe('when disabled', () => {13 beforeEach(() => {14 plugin.disable();15 });16 describe('onReadyToRecord', () => {17 beforeEach(async () => {18 await plugin.onReadyToRecord();19 });20 it('should end correctly, but do nothing', expectThatNothingActuallyHappens);21 });22 describe('onBeforeEach', () => {23 beforeEach(async () => {24 await plugin.onBeforeEach(testSummaries.running());25 });26 it('should end correctly, but do nothing', expectThatNothingActuallyHappens);27 });28 describe('onAfterEach', () => {29 beforeEach(async () => {30 await plugin.onBeforeEach(testSummaries.running());31 await plugin.onAfterEach(testSummaries.failed());32 });33 it('should end correctly, but do nothing', expectThatNothingActuallyHappens);34 });35 describe('onAfterAll', () => {36 beforeEach(async () => {37 await plugin.onBeforeEach(testSummaries.running());38 await plugin.onAfterEach(testSummaries.failed());39 await plugin.onAfterAll();40 });41 it('should end correctly, but do nothing', expectThatNothingActuallyHappens);42 });43 async function expectThatNothingActuallyHappens() {44 expect(plugin.createStartupRecording).not.toHaveBeenCalled();45 expect(plugin.createTestRecording).not.toHaveBeenCalled();46 expect(plugin.startupRecording).toBe(null);47 expect(plugin.testRecording).toBe(null);48 expect(plugin.currentRecording).toBe(null);49 }50 });51 describe('app launch in start-up phase', () => {52 beforeEach(async () => {53 await plugin.onReadyToRecord();54 });55 it('should create start-up recording', () => {56 expect(plugin.createStartupRecording).toHaveBeenCalled();57 });58 it('should set it to protected .startupRecording property', () => {59 expect(plugin.startupRecording).toBe(plugin.createdArtifacts[0]);60 });61 it('should set it to protected .currentRecording property', () => {62 expect(plugin.currentRecording).toBe(plugin.startupRecording);63 });64 it('should put the start-up recording under the tracking system', () => {65 expect(api.trackArtifact).toHaveBeenCalledWith(plugin.startupRecording);66 });67 });68 describe('onBeforeEach', () => {69 describe('if app was launched before', () => {70 beforeEach(async () => {71 await plugin.onReadyToRecord();72 await plugin.onBeforeEach(testSummaries.running());73 });74 it('should stop start-up recording', () => {75 expect(plugin.startupRecording.stop).toHaveBeenCalled();76 });77 it('should change protected .current property value', () => {78 expect(plugin.currentRecording).toBe(plugin.createdArtifacts[1]);79 });80 });81 describe('', () => {82 beforeEach(async () => {83 await plugin.onBeforeEach(testSummaries.running());84 });85 it('should create test recording', () => {86 expect(plugin.createTestRecording).toHaveBeenCalled();87 });88 it('should set to protected .testRecording property', () => {89 expect(plugin.testRecording).toBe(plugin.createdArtifacts[0]);90 });91 it('should set to protected .currentRecording property', () => {92 expect(plugin.currentRecording).toBe(plugin.testRecording);93 });94 it('should start test recording', () => {95 expect(plugin.testRecording.start).toHaveBeenCalled();96 });97 it('should put the test recording under the tracking system', () => {98 expect(api.trackArtifact).toHaveBeenCalledWith(plugin.testRecording);99 });100 });101 });102 describe('onAfterEach', () => {103 describe('when plugin is keeping only artifacts from failed tests', () => {104 beforeEach(() => {105 plugin.keepOnlyFailedTestsArtifacts = true;106 });107 describe('and current test passed well', () => {108 beforeEach(async () => {109 await plugin.onReadyToRecord();110 await plugin.onBeforeEach(testSummaries.running());111 await plugin.onAfterEach(testSummaries.passed());112 await api.emulateRunningAllIdleCallbacks();113 });114 it('should not clean start-up recording property', () => {115 expect(plugin.startupRecording).toBeTruthy();116 });117 it('should not interact with start-up property anyhow', () => {118 expect(plugin.startupRecording.save).not.toHaveBeenCalled();119 expect(plugin.startupRecording.discard).not.toHaveBeenCalled();120 });121 });122 describe('and current test failed', () => {123 beforeEach(async () => {124 await plugin.onReadyToRecord();125 await plugin.onBeforeEach(testSummaries.running());126 await plugin.onAfterEach(testSummaries.failed());127 });128 itShouldScheduleSavingAndUntrackingOfBothArtifacts();129 });130 });131 describe('when plugin is keeping all artifacts', () => {132 beforeEach(() => {133 plugin.keepOnlyFailedTestsArtifacts = false;134 });135 describe('and test finished anyhow', () => {136 beforeEach(async () => {137 await plugin.onReadyToRecord();138 await plugin.onBeforeEach(testSummaries.running());139 await plugin.onAfterEach(testSummaries.passed());140 });141 itShouldScheduleSavingAndUntrackingOfBothArtifacts();142 });143 });144 });145 describe('onAfterAll', () => {146 describe('when the plugin is configured to keep all artifacts', () => {147 beforeEach(() => {148 plugin.keepOnlyFailedTestsArtifacts = false;149 });150 describe('when there were no calls to .onBeforeEach and .onAfterEach', () => {151 beforeEach(async () => {152 await plugin.onReadyToRecord();153 await plugin.onAfterAll();154 });155 it('should schedule saving of the start-up recording', () => {156 expect(api.requestIdleCallback).toHaveBeenCalledTimes(1);157 expect(api.requestIdleCallback.mock.calls[0]).toEqual([expect.any(Function)]);158 });159 it('should reset .startupRecording property to null', async () => {160 expect(plugin.startupRecording).toBe(null);161 });162 it('should eventually save the start-up recording', async () => {163 const [saveStartupRecordingRequest] = api.requestIdleCallback.mock.calls[0];164 const [startupRecording] = plugin.createdArtifacts;165 expect(startupRecording.save).not.toHaveBeenCalled();166 await saveStartupRecordingRequest();167 expect(startupRecording.save).toHaveBeenCalledWith('/tmp/fakeStartupArtifact');168 });169 it('should eventually untrack the start-up recording', async () => {170 const [saveStartupRecordingRequest] = api.requestIdleCallback.mock.calls[0];171 const [startupRecording] = plugin.createdArtifacts;172 expect(api.untrackArtifact).not.toHaveBeenCalledWith(startupRecording);173 await saveStartupRecordingRequest();174 expect(api.untrackArtifact).toHaveBeenCalledWith(startupRecording);175 });176 });177 describe('when there were already calls to .onAfterEach', () => {178 beforeEach(async () => {179 await plugin.onReadyToRecord();180 await plugin.onBeforeEach(testSummaries.running());181 await plugin.onAfterEach(testSummaries.passed());182 api.requestIdleCallback.mockClear();183 });184 it('should already have reset .startupRecording to null', () => {185 expect(plugin.startupRecording).toBe(null);186 });187 it('should not schedule anything extra', async () => {188 expect(api.requestIdleCallback).not.toHaveBeenCalled();189 });190 });191 });192 describe('when the plugin is configured to keep only failing artifacts', () => {193 beforeEach(() => {194 plugin.keepOnlyFailedTestsArtifacts = true;195 });196 describe('when there were no calls to .onBeforeEach and .onAfterEach', () => {197 beforeEach(async () => {198 await plugin.onReadyToRecord();199 api.requestIdleCallback.mockClear();200 await plugin.onAfterAll();201 });202 itShouldScheduleDiscardingAndUntrackingOfStartupArtifact();203 });204 describe('when all tests were successful', () => {205 beforeEach(async () => {206 await plugin.onReadyToRecord();207 await plugin.onBeforeEach(testSummaries.running());208 await plugin.onAfterEach(testSummaries.passed());209 api.requestIdleCallback.mockClear();210 await plugin.onAfterAll();211 });212 itShouldScheduleDiscardingAndUntrackingOfStartupArtifact();213 })214 });215 });216 function itShouldScheduleSavingAndUntrackingOfBothArtifacts() {217 it('should reset .startupRecording property', () => {218 expect(plugin.startupRecording).toBe(null);219 });220 it('should schedule two operations', () => {221 expect(api.requestIdleCallback).toHaveBeenCalledTimes(2);222 expect(api.requestIdleCallback.mock.calls[0]).toEqual([expect.any(Function)]);223 expect(api.requestIdleCallback.mock.calls[1]).toEqual([expect.any(Function)]);224 });225 it('should schedule saving of the test recording', async () => {226 const [,testRecording] = plugin.createdArtifacts;227 const [saveTestRecordingRequest] = api.requestIdleCallback.mock.calls[0];228 expect(testRecording.save).not.toHaveBeenCalled();229 await saveTestRecordingRequest();230 expect(testRecording.save).toHaveBeenCalledWith('/tmp/test/fakeArtifact');231 });232 it('should schedule saving of the start-up recording', async () => {233 const [startupRecording] = plugin.createdArtifacts;234 const [saveStartupRecordingRequest] = api.requestIdleCallback.mock.calls[1];235 expect(startupRecording.save).not.toHaveBeenCalled();236 await saveStartupRecordingRequest();237 expect(startupRecording.save).toHaveBeenCalledWith('/tmp/fakeStartupArtifact');238 });239 it('should untrack the start-up recording after it is saved', async () => {240 const [startupRecording] = plugin.createdArtifacts;241 const [saveStartupRecordingRequest] = api.requestIdleCallback.mock.calls[1];242 expect(api.untrackArtifact).not.toHaveBeenCalledWith(startupRecording);243 await saveStartupRecordingRequest();244 expect(api.untrackArtifact).toHaveBeenCalledWith(startupRecording);245 });246 }247 function itShouldScheduleDiscardingAndUntrackingOfStartupArtifact() {248 it('should schedule discarding of the start-up recording', () => {249 expect(api.requestIdleCallback).toHaveBeenCalledTimes(1);250 expect(api.requestIdleCallback.mock.calls[0]).toEqual([expect.any(Function)]);251 });252 it('should reset .startupRecording property to null', async () => {253 expect(plugin.startupRecording).toBe(null);254 });255 it('should eventually discard the start-up recording', async () => {256 const [discardRequest] = api.requestIdleCallback.mock.calls[0];257 const [startupRecording] = plugin.createdArtifacts;258 expect(startupRecording.discard).not.toHaveBeenCalled();259 await discardRequest();260 expect(startupRecording.discard).toHaveBeenCalled();261 });262 it('should eventually untrack the start-up recording', async () => {263 const [discardRequest] = api.requestIdleCallback.mock.calls[0];264 const [startupRecording] = plugin.createdArtifacts;265 expect(api.untrackArtifact).not.toHaveBeenCalledWith(startupRecording);266 await discardRequest();267 expect(api.untrackArtifact).toHaveBeenCalledWith(startupRecording);268 });269 }270});271class FakeStartupAndTestRecorderPlugin extends StartupAndTestRecorderPlugin {272 constructor(...args) {273 super(...args);274 this.enabled = true;275 this.createStartupRecording = jest.fn(this.createStartupRecording.bind(this));276 this.createTestRecording = jest.fn(this.createTestRecording.bind(this));277 this.createdArtifacts = [];278 }279 preparePathForStartupArtifact() {280 super.preparePathForStartupArtifact();281 return '/tmp/fakeStartupArtifact';282 }283 preparePathForTestArtifact(testSummary) {284 super.preparePathForTestArtifact(testSummary);285 return `/tmp/${testSummary.title}/fakeArtifact`;286 }287 createStartupRecording() {288 super.createStartupRecording();289 return this._createArtifactMock('startup');290 }291 createTestRecording() {292 super.createTestRecording();293 return this._createArtifactMock('test');294 }295 _createArtifactMock(type) {296 const artifact = {297 type,298 start: jest.fn(),299 stop: jest.fn(),300 save: jest.fn(),301 discard: jest.fn(),302 };303 this.createdArtifacts.push(artifact);304 return artifact;305 }...

Full Screen

Full Screen

TwoSnapshotsPerTestPlugin.test.js

Source:TwoSnapshotsPerTestPlugin.test.js Github

copy

Full Screen

1jest.mock('../../../utils/logger.js');2const TwoSnapshotsPerTestPlugin = require('./TwoSnapshotsPerTestPlugin');3const ArtifactsApi = require('./__mocks__/ArtifactsApi.mock');4const testSummaries = require('./__mocks__/testSummaries.mock');5describe('TwoSnapshotsPerTestPlugin', () => {6 let api;7 let plugin;8 beforeEach(() => {9 api = new ArtifactsApi();10 plugin = new FakeTwoSnapshotsPerTestPlugin({ api });11 });12 describe('when disabled', () => {13 beforeEach(() => plugin.disable());14 describe('onBeforeEach', () => {15 beforeEach(async () => plugin.onBeforeEach(testSummaries.running()));16 it('should not create artifact onBeforeEach', async () =>17 expect(plugin.createTestArtifact).not.toHaveBeenCalled());18 });19 describe('when configured to keep artifacts', function() {20 beforeEach(() => plugin.configureToKeepArtifacts(true));21 describe('onAfterEach', () => {22 beforeEach(async () => plugin.onAfterEach(testSummaries.passed()));23 it('should not do create artifacts', async () =>24 expect(plugin.createTestArtifact).not.toHaveBeenCalled());25 it('should not do request idle callbacks', async () =>26 expect(api.requestIdleCallback).not.toHaveBeenCalled());27 });28 });29 describe('when configured to keep artifacts', function() {30 beforeEach(() => plugin.configureToKeepArtifacts(false));31 describe('onAfterEach', () => {32 beforeEach(async () => plugin.onAfterEach(testSummaries.passed()));33 it('should not do create artifacts', async () =>34 expect(plugin.createTestArtifact).not.toHaveBeenCalled());35 it('should not do request idle callbacks', async () =>36 expect(api.requestIdleCallback).not.toHaveBeenCalled());37 });38 });39 });40 describe('when onBeforeEach called', function() {41 beforeEach(async () => {42 await plugin.onBeforeEach(testSummaries.running());43 });44 it('should create test artifact', () => {45 expect(plugin.createTestArtifact).toHaveBeenCalledTimes(1);46 });47 it('should start and stop recording in the artifact', () => {48 const [createdArtifact] = plugin.createdArtifacts;49 expect(createdArtifact.start).toHaveBeenCalledTimes(1);50 expect(createdArtifact.stop).toHaveBeenCalledTimes(1);51 });52 it('should put the artifact under tracking', () => {53 const [createdArtifact] = plugin.createdArtifacts;54 expect(api.trackArtifact).toHaveBeenCalledWith(createdArtifact);55 });56 });57 describe('when the plugin should keep a test artifact', () => {58 beforeEach(() => plugin.configureToKeepArtifacts(true));59 describe('when onBeforeEach and onAfterEach are called', () => {60 beforeEach(async () => {61 await plugin.onBeforeEach(testSummaries.running());62 await plugin.onAfterEach(testSummaries.passed());63 });64 it('should create the second test artifact', () => {65 expect(plugin.createTestArtifact).toHaveBeenCalledTimes(2);66 });67 it('should start and stop the second test artifact', () => {68 const [, secondArtifact] = plugin.createdArtifacts;69 expect(secondArtifact.start).toHaveBeenCalledTimes(1);70 expect(secondArtifact.stop).toHaveBeenCalledTimes(1);71 });72 it('should put the second test artifact under tracking', () => {73 const [, secondArtifact] = plugin.createdArtifacts;74 expect(api.trackArtifact).toHaveBeenCalledWith(secondArtifact);75 });76 it('should schedule two saving operations and specify itself as an initiator', () => {77 expect(api.requestIdleCallback).toHaveBeenCalledTimes(2);78 expect(api.requestIdleCallback.mock.calls[0]).toEqual([expect.any(Function)]);79 expect(api.requestIdleCallback.mock.calls[1]).toEqual([expect.any(Function)]);80 });81 it('should schedule to save and untrack the first artifact', async () => {82 const [saveRequest] = api.requestIdleCallback.mock.calls[0];83 expect(plugin.createdArtifacts[0].save).not.toHaveBeenCalled();84 expect(api.untrackArtifact).not.toHaveBeenCalled();85 await saveRequest();86 expect(plugin.createdArtifacts[0].save).toBeCalledWith('test/beforeEach.png');87 expect(api.untrackArtifact).toBeCalledWith(plugin.createdArtifacts[0]);88 });89 it('should ultimately save and untrack the second artifact', async () => {90 const [saveRequest] = api.requestIdleCallback.mock.calls[1];91 expect(plugin.createdArtifacts[1].save).not.toHaveBeenCalled();92 expect(api.untrackArtifact).not.toHaveBeenCalled();93 await saveRequest();94 expect(plugin.createdArtifacts[1].save).toBeCalledWith('test/afterEach.png');95 expect(api.untrackArtifact).toBeCalledWith(plugin.createdArtifacts[1]);96 });97 });98 });99 describe('when the plugin should not keep a test artifact', () => {100 beforeEach(() => plugin.configureToKeepArtifacts(false));101 describe('when onBeforeEach and onAfterEach are called', () => {102 beforeEach(async () => {103 await plugin.onBeforeEach(testSummaries.running());104 await plugin.onAfterEach(testSummaries.passed());105 });106 it('should not create the second test artifact', () => {107 expect(plugin.createTestArtifact).toHaveBeenCalledTimes(1);108 });109 it('should schedule a discard operation for the first artifact and specify itself as an initiator', () => {110 expect(api.requestIdleCallback).toHaveBeenCalledTimes(1);111 expect(api.requestIdleCallback.mock.calls[0]).toEqual([expect.any(Function)]);112 });113 it('should ultimately discard and untrack the first artifact', async () => {114 const [discardRequest] = api.requestIdleCallback.mock.calls[0];115 expect(plugin.createdArtifacts[0].discard).not.toHaveBeenCalled();116 expect(api.untrackArtifact).not.toHaveBeenCalled();117 await discardRequest();118 expect(plugin.createdArtifacts[0].discard).toHaveBeenCalledTimes(1);119 expect(api.untrackArtifact).toBeCalledWith(plugin.createdArtifacts[0]);120 });121 });122 });123});124class FakeTwoSnapshotsPerTestPlugin extends TwoSnapshotsPerTestPlugin {125 constructor(...args) {126 super(...args);127 this.enabled = true;128 this.createTestArtifact = jest.fn(this.createTestArtifact.bind(this));129 this.createdArtifacts = [];130 }131 configureToKeepArtifacts(shouldKeep) {132 this.shouldKeepArtifactOfTest = () => shouldKeep;133 }134 preparePathForSnapshot(testSummary, index) {135 super.preparePathForSnapshot(testSummary, index);136 return `${testSummary.title}/${index}.png`;137 }138 createTestArtifact() {139 super.createTestArtifact();140 const artifact = {141 start: jest.fn(),142 stop: jest.fn(),143 save: jest.fn(),144 discard: jest.fn(),145 };146 this.createdArtifacts.push(artifact);147 return artifact;148 }...

Full Screen

Full Screen

WholeTestRecorderPlugin.test.js

Source:WholeTestRecorderPlugin.test.js Github

copy

Full Screen

1jest.mock('../../../utils/logger.js');2const WholeTestRecorderPlugin = require('./WholeTestRecorderPlugin');3const ArtifactsApi = require('./__mocks__/ArtifactsApi.mock');4const testSummaries = require('./__mocks__/testSummaries.mock');5describe('WholeTestRecorderPlugin', () => {6 let api;7 let plugin;8 beforeEach(() => {9 api = new ArtifactsApi();10 plugin = new FakeWholeTestRecorderPlugin({ api });11 });12 describe('when disabled', () => {13 beforeEach(() => plugin.disable());14 describe('onBeforeEach', () => {15 beforeEach(async () => plugin.onBeforeEach(testSummaries.running()));16 it('should not create recording onBeforeEach', async () =>17 expect(plugin.createTestRecording).not.toHaveBeenCalled());18 });19 describe('onAfterEach', () => {20 beforeEach(async () => plugin.onAfterEach(testSummaries.passed()));21 it('should not create recording', async () =>22 expect(plugin.createTestRecording).not.toHaveBeenCalled());23 it('should not do request idle callbacks', async () =>24 expect(api.requestIdleCallback).not.toHaveBeenCalled());25 });26 });27 describe('onBeforeEach', () => {28 beforeEach(async () => plugin.onBeforeEach(testSummaries.running()));29 it('should create artifact', async () => {30 expect(plugin.createTestRecording).toHaveBeenCalled();31 });32 it('should start recording artifact', async () => {33 expect(plugin.createdArtifacts[0].start).toHaveBeenCalledTimes(1);34 });35 it('should not stop recording artifact', async () => {36 expect(plugin.createdArtifacts[0].stop).not.toHaveBeenCalled();37 });38 it('should put the artifact under tracking', async () => {39 expect(api.trackArtifact).toHaveBeenCalledWith(plugin.createdArtifacts[0]);40 });41 });42 describe('when the plugin should keep a test artifact', () => {43 beforeEach(() => plugin.configureToKeepArtifacts(true));44 describe('onAfterEach', () => {45 beforeEach(async () => {46 await plugin.onBeforeEach(testSummaries.running());47 await plugin.onAfterEach(testSummaries.failed());48 });49 it('should stop artifact recording', async () => {50 expect(plugin.createdArtifacts[0].stop).toHaveBeenCalled();51 });52 it('should schedule a save operation and specify itself as an initiator', () => {53 expect(api.requestIdleCallback).toHaveBeenCalledTimes(1);54 expect(api.requestIdleCallback.mock.calls[0]).toEqual([expect.any(Function)]);55 });56 it('should ultimately save the artifact and untrack it', async () => {57 const [saveRequest] = api.requestIdleCallback.mock.calls[0];58 expect(plugin.createdArtifacts[0].save).not.toHaveBeenCalled();59 expect(api.untrackArtifact).not.toHaveBeenCalled();60 await saveRequest();61 expect(plugin.createdArtifacts[0].save).toBeCalledWith('/tmp/test/fakeArtifact');62 expect(api.untrackArtifact).toBeCalledWith(plugin.createdArtifacts[0]);63 })64 });65 });66 describe('when the plugin should discard a test artifact', () => {67 beforeEach(() => plugin.configureToKeepArtifacts(false));68 describe('onAfterEach', () => {69 beforeEach(async () => {70 await plugin.onBeforeEach(testSummaries.running());71 await plugin.onAfterEach(testSummaries.failed());72 });73 it('should stop artifact recording', async () => {74 expect(plugin.createdArtifacts[0].stop).toHaveBeenCalled();75 });76 it('should schedule a discard operation and specify itself as an initiator', () => {77 expect(api.requestIdleCallback).toHaveBeenCalledTimes(1);78 expect(api.requestIdleCallback.mock.calls[0]).toEqual([expect.any(Function)]);79 });80 it('should ultimately discard the artifact and untrack it', async () => {81 const [discardRequest] = api.requestIdleCallback.mock.calls[0];82 expect(plugin.createdArtifacts[0].discard).not.toHaveBeenCalled();83 expect(api.untrackArtifact).not.toHaveBeenCalled();84 await discardRequest();85 expect(plugin.createdArtifacts[0].discard).toBeCalled();86 expect(api.untrackArtifact).toBeCalledWith(plugin.createdArtifacts[0]);87 })88 });89 });90});91class FakeWholeTestRecorderPlugin extends WholeTestRecorderPlugin {92 constructor(...args) {93 super(...args);94 this.enabled = true;95 this.createTestRecording = jest.fn(this.createTestRecording.bind(this));96 this.createdArtifacts = [];97 }98 configureToKeepArtifacts(shouldKeep) {99 this.shouldKeepArtifactOfTest = () => shouldKeep;100 }101 preparePathForTestArtifact(testSummary) {102 super.preparePathForTestArtifact(testSummary);103 return `/tmp/${testSummary.title}/fakeArtifact`;104 }105 createTestRecording() {106 super.createTestRecording();107 const artifact = {108 start: jest.fn(),109 stop: jest.fn(),110 save: jest.fn(),111 discard: jest.fn(),112 };113 this.createdArtifacts.push(artifact);114 return artifact;115 }...

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run qawolf automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful