Publicidad

Make BDD great again

QA Team Lead, Business Development (ThinkMobiles)
25 de Feb de 2020
Publicidad

Más contenido relacionado

Publicidad

Make BDD great again

  1. MAKE BDD GREAT AGAIN :) P R O T R A C T O R & C U C U M B E R
  2. IANA KOKRIASHKINA Skype: yanochka_3007 email: yana.gusti@gmail.com
  3. MAIN TASK Code review of existing tests Save current project Do better on new projects
  4. STEP DEFINITIONS
  5. CODE REVIEW OF PROJECT STRUCTURE • Each feature has it’s own step-definition file • Each step has it’s own implementation
  6. WHAT CUCUMBER TUTORIALS SAY https://cucumber.io/docs/gherkin/step-organization/
  7. JETBRAINS USER GUIDE https://www.jetbrains.com/help/idea/creating-step-definition.html
  8. FIRST STEPS TO SAVE PROJECT • 1 actions file and one verifications file
  9. REPORTS REVIEW
  10. REPORTS REVIEW No reporting Main problem of testing - its absence
  11. STEPS IMPLEMENTATION
  12. IMPLEMENTATIONS OF CUCUMBER STEPS • Some steps were not implemented • Some functions were overcomplicated
  13. REPLACE REGEXP WITH CUCUMBER EXPRESSIONS • Parameter types - https://cucumber.io/docs/cucumber/cucumber-expressions/
  14. IMPLEMENT YOUR OWN TYPES {url} defineParameterType({ name: 'url', transformer(string) { if (string.indexOf('http') === 0) { return string; } return object.urls[string][environment]; } }); urls: { MAIN_URL: { DEV: "https://test.com", LOCAL: "http://localhost:3000" }, API: { DEV: "https://test.com/#/api", LOCAL: "http://localhost:3000#/api" },
  15. IMPLEMENT YOUR OWN TYPES {user} defineParameterType({ name: 'user', transformer(role) { return object.users[role][environment]; } }); users: { USER: { DEV: { login: "test", password: "test" }, PROD: { login: "user_test@test.com", password: "1234" } }, ADMIN: { DEV: { login: "admin", password: "admin" }, PROD: { login: "admin_test@test.com", password: "123456" } } }
  16. IMPLEMENT YOUR OWN TYPES In *.feature file User logs in as "USER" on "MAIN” User logs in as "ADMIN" on "API" users: { USER: { DEV: { login: "test", password: "test" }, …… ADMIN: { DEV: { login: "admin", password: "admin" }, ____________________________ urls: { MAIN: { DEV: "http://juliemr.github.io/protractor-demo/", …….. API: { DEV: "http://juliemr.github.io/protractor-demo/api", In conf.js params: { timeout: 3000, env: process.env.TEST_ENV || 'LOCAL', }, process.env.TEST_ENV = DEV
  17. SETUP JENKINS JOB #!/usr/bin/env bash # Use this script to run tests npm i npm run webdriver & # Wait for port 5555 to be listening connections chmod +x wait-for-it.sh && ./wait-for-it.sh -t 60 127.0.0.1:5555 -- echo "driver is up" npm run test-jenkins
  18. LOCALIZATION TESTING
  19. LOCALIZATION TESTING • Parameter type to check text depending of specified language defineParameterType({ name: 'text', transformer: function (s) { if (s.indexOf(':') !== -1) { let dataArray = s.split(':'); let page = dataArray[0]; let textToVerify = dataArray[1]; return text[page][textToVerify][language]; } return s; } }); mainPage: { pageTitle: { ENG: "Wikipedia, the free encyclopedia", RU: "Википедия — свободная энциклопедия" ……….. WIKI: { DEV:{ RU: "https://ru.wikipedia.org/", ENG: "https://en.wikipedia.org/" }, }, params: { env: process.env.TEST_ENV || 'DEV', lan: process.env.TEST_LAN || 'ENG' },
  20. TEST SPECIAL SYMBOLS
  21. PARAMETER TYPES WITH REGEXP defineParameterType({ name: 'text', transformer: function (s) { if (s.indexOf('REGEXP:') !== -1) { s = s.split('REGEXP:')[1]; let dataArray = s.split(':'); let page = dataArray[0]; let textToVerify = dataArray[1]; return new RegExp(text[page][textToVerify][language]); } } }); todayText: { ENG: "single's", RU: "(англ.)русск.," } Then Article "wikiPage|todayText" with text "REGEXP:mainPage:todayText" is displayed And Article "wikiPage|todayText" with text "mainPage:todayText" is displayed
  22. SEVERAL MORE IMPROVEMENTS 1. MULTIPLE BROWSERS 2. REUSING THE BROWSER WINDOW 3. TIMEOUTS 4. ATTACHMENTS
  23. SLACK FOR FAST REPORTING
  24. DO BETTER ON NEW PROJECTS
  25. DO BETTER ON NEW PROJECTS • Move common steps, helpers, hooks, configurations to the library • Work with API for preconditions login: async (host, username, password) => { let loginRequest = host + "/login"; let data = {"username": username, "password": password}; let headers = new Map(); headers.set("accept", "application/json"); headers.set("Content-Type", "application/json"); const res = await api.getResponseHeaders("POST", loginRequest, JSON.stringify(data), headers); const token = await res['authorization']; return await global.uniqueMap[token] = token; }, await userApi.login(host, user.login, user.password); When('{user} uploads file to server {landing-url}', async function (user, host) { let token = global.uniqueMap[token]; .......... }
  26. REUSE DATA WITHIN SESSION let response = await apiHelper.sendRequest("GET", url, '', headers); return browser.getSession().then(session => { let body = JSON.parse(response.body); let coordinates = body['coord']; let lat = coordinates['lat']; let lon = coordinates['lon']; global.uniqueMap[`${session['id_']}lat`] =lat; global.uniqueMap[`${session['id_']}lon`] =lon; }); return browser.getSession().then(session => { let lat = global.uniqueMap[`${session['id_']}lat`]; let lon = global.uniqueMap[`${session['id_']}lon`]; let url = string+'/weather?lat='+lat+'&lon='+lon let headers = new Map(); headers.set("accept", "application/json"); return apiHelper.sendRequest("GET", url, '', headers).then(function (response) { …………….. }) {"b546863e5dc9ea38992a5c5d99570efflat":51.51,"b546863e5dc9ea38992a5c5d99570efflon":-0.13}
  27. WORK WITH FILES
  28. WORK WITH FILES IN HEADLESS MODE Before(function () { return browser.getCapabilities().then(caps => { return browser.getProcessedConfig().then((config) => { if (caps.get('browserName') === 'chrome') { return browser.getSession().then(function (session) { const params = { cmd: 'Page.setDownloadBehavior', params: {behavior: 'allow', downloadPath: browser.params.basePath} }; return endpointHelper.sendRequest('POST', `${config.seleniumAddress}/session/${session.id_}/chromium/send_command`, JSON.stringify(params)); }); } });
  29. WORK WITH EXCEL FILES Then('User verifies that file {string} is downloaded', (fileName) => { const filePath = browser.params.basePath + fileSep + fileName; return browser.wait(function () { return fs.existsSync(filePath); }, 30000, "Wait for '" + filePath + "' to be downloaded").then(function () { return true; }); });
  30. VERIFY FILE BY HASH • Navigate to https://md5file.com/calculator • Upload a file that you want to use as template • Copy calculated value for hash type SHA-1 and paste it into Then('User verify downloaded file {text} hash is equal to {hash}', function (fileName, hash) { return expect(fileHelper.getFileHash(fileName)).to.eventually.equal(hash); }); Then User verify downloaded file "Test.xlsx" hash is equal to "HASH:fileHash” hashes: { fileHash: 'e2c39165ebd60772062684d218259370c739b062', }
  31. GITHUB REPO https://github.com/yana-gusti/Protractortest
  32. THANK YOU! YANA.GUSTI@GMAIL.COM IANA KOKRIASHKINA @YANA_GUSTI_ YANA.GUSTI.7 IANA KOKRIASHKINA
Publicidad