From a8512fae0a6ede336359905eb3eb7bf6d967fd01 Mon Sep 17 00:00:00 2001 From: najeeb1023 Date: Wed, 19 Jun 2024 21:10:51 +0200 Subject: [PATCH 1/5] debug logger added --- package-lock.json | 24 ++++++++++++++++++++++++ package.json | 8 +++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a38112..2502d3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@semantic-release/git": "^10.0.1", "@semantic-release/github": "^10.0.3", "@types/node": "^20.14.2", + "cucumber-console-formatter": "^1.0.0", "semantic-release": "^24.0.0", "ts-node": "^10.9.2" } @@ -1239,6 +1240,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/lodash": { + "version": "4.14.167", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz", + "integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.14.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", @@ -1999,6 +2007,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cucumber-console-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cucumber-console-formatter/-/cucumber-console-formatter-1.0.0.tgz", + "integrity": "sha512-2DtwlLDE+URsh6/optsjH4/JLF01p9pkBMxBhH702neUrtU/FXm9FEyBYqhg5355MIq2FgEdRB3AcoVfBxO8hw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/lodash": "4.14.167" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@cucumber/cucumber": ">= 7.0.0" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", diff --git a/package.json b/package.json index f641c72..e61b8b9 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "main": "index.js", "scripts": { "lunaapp": "cucumber-js --config=config/cucumber.js", - "lunaapp:tag": "cucumber-js --config=config/cucumber.js --tags " + "lunaapp:tags": "cucumber-js --config=config/cucumber.js --tags ", + "lunaapp:debug": "cucumber-js --config=config/cucumber.js --format cucumber-console-formatter --tags @MenShopping" }, "keywords": [], "author": "", @@ -14,10 +15,11 @@ "@cucumber/cucumber": "^10.8.0", "@cucumber/pretty-formatter": "^1.0.1", "@playwright/test": "^1.44.1", - "@types/node": "^20.14.2", - "semantic-release": "^24.0.0", "@semantic-release/git": "^10.0.1", "@semantic-release/github": "^10.0.3", + "@types/node": "^20.14.2", + "cucumber-console-formatter": "^1.0.0", + "semantic-release": "^24.0.0", "ts-node": "^10.9.2" } } From 64f6045602012319fd323a1d76bf15439de1ecf3 Mon Sep 17 00:00:00 2001 From: najeeb1023 Date: Thu, 20 Jun 2024 17:44:19 +0200 Subject: [PATCH 2/5] winston logger WIP. --- logger/logger.ts | 20 +++ package-lock.json | 277 +++++++++++++++++++++++++++++- package.json | 5 +- playwright.config.ts | 8 +- src/test/hooks/hooks.ts | 10 +- src/test/hooks/pageFixture.ts | 4 +- src/test/pages/AccountRegister.ts | 2 + src/test/steps/registerUser.ts | 2 +- 8 files changed, 317 insertions(+), 11 deletions(-) create mode 100644 logger/logger.ts diff --git a/logger/logger.ts b/logger/logger.ts new file mode 100644 index 0000000..583e76b --- /dev/null +++ b/logger/logger.ts @@ -0,0 +1,20 @@ +import { transports, format } from "winston"; +import winston from "winston"; + +const customFormat = winston.format.printf(({ level, message, timestamp }) => { + return `${timestamp} [${level}]: ${message}`; + }); + +export function options(scenarioName: string){ + return { + transports: [ + new transports.File({ + filename: `test-results/logs/${scenarioName}/log.log`, + level: 'info', + format: format.combine( + customFormat + ) + }), + ] + }; +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2502d3a..4b6eb7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,8 @@ "@types/node": "^20.14.2", "cucumber-console-formatter": "^1.0.0", "semantic-release": "^24.0.0", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "winston": "^3.13.0" } }, "node_modules/@babel/code-frame": { @@ -364,6 +365,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1271,6 +1284,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/uuid": { "version": "9.0.8", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", @@ -1476,6 +1496,13 @@ "repeat-string": "^1.6.1" } }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true, + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -1791,6 +1818,17 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1811,6 +1849,45 @@ "dev": true, "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -2208,6 +2285,13 @@ "dev": true, "license": "MIT" }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true, + "license": "MIT" + }, "node_modules/env-ci": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.0.0.tgz", @@ -2588,6 +2672,13 @@ "reusify": "^1.0.4" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "dev": true, + "license": "MIT" + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -2661,6 +2752,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "dev": true, + "license": "MIT" + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3789,6 +3887,13 @@ "seed-random": "~2.2.0" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true, + "license": "MIT" + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -3902,6 +4007,34 @@ "dev": true, "license": "MIT" }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/logform/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -6909,6 +7042,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -7777,6 +7920,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/seed-random": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", @@ -8100,6 +8253,23 @@ "node": ">=4" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true, + "license": "MIT" + }, "node_modules/skin-tone": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", @@ -8200,6 +8370,16 @@ "through2": "~2.0.0" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", @@ -8529,6 +8709,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true, + "license": "MIT" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -8634,6 +8821,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", @@ -9033,6 +9230,84 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/winston": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "dev": true, + "license": "MIT", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index e61b8b9..b22bb20 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "lunaapp": "cucumber-js --config=config/cucumber.js", "lunaapp:tags": "cucumber-js --config=config/cucumber.js --tags ", - "lunaapp:debug": "cucumber-js --config=config/cucumber.js --format cucumber-console-formatter --tags @MenShopping" + "lunaapp:debug": "cucumber-js --config=config/cucumber.js --format cucumber-console-formatter --tags @debug" }, "keywords": [], "author": "", @@ -20,6 +20,7 @@ "@types/node": "^20.14.2", "cucumber-console-formatter": "^1.0.0", "semantic-release": "^24.0.0", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "winston": "^3.13.0" } } diff --git a/playwright.config.ts b/playwright.config.ts index 91cdf4c..c4664b0 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -4,7 +4,9 @@ export const config: LaunchOptions = { timeout: 600000, headless: true, args:['--start-maximized'], - slowMo: 300 - - + slowMo: 300, + logger: { + isEnabled: (name, severity) => true, + log: (name, severity, message, args) => console.log(`name = ${name} \n msg = ${message} \n severity = ${severity}`) + } } \ No newline at end of file diff --git a/src/test/hooks/hooks.ts b/src/test/hooks/hooks.ts index 6c783ed..5b59d94 100644 --- a/src/test/hooks/hooks.ts +++ b/src/test/hooks/hooks.ts @@ -2,6 +2,8 @@ import { After, AfterAll, Before, BeforeAll, Status } from "@cucumber/cucumber"; import { Browser, BrowserContext, chromium } from "@playwright/test"; import { config } from "../../../playwright.config"; import { pageFixture } from "./pageFixture"; +import { createLogger } from "winston"; +import { options } from "../../../logger/logger"; let browser: Browser; let context: BrowserContext; @@ -10,22 +12,24 @@ BeforeAll(async function () { browser = await chromium.launch(config); }); -Before(async function () { +Before(async function ({ pickle }) { + const scenarioName = pickle.name + pickle.id; context = await browser.newContext({viewport: null}); const page = await context.newPage(); pageFixture.page = page; + pageFixture.logger = createLogger(options(scenarioName)); }); -After(async function ({pickle, result}) { +After(async function ({ pickle, result }) { console.log(result?.status); if(result?.status == Status.PASSED){ const img = await pageFixture.page.screenshot({path:`./test-results/screenshots/${pickle.name}.png`, type: "png"}); await this.attach(img, "image/png"); - }; }); AfterAll(async function () { await pageFixture.page.waitForTimeout(2000); await browser.close(); + pageFixture.logger.close(); }); \ No newline at end of file diff --git a/src/test/hooks/pageFixture.ts b/src/test/hooks/pageFixture.ts index 001e21f..a8004bb 100644 --- a/src/test/hooks/pageFixture.ts +++ b/src/test/hooks/pageFixture.ts @@ -1,6 +1,8 @@ import { Page } from "@playwright/test"; +import { Logger } from "winston"; export const pageFixture = { // @ts-ignore - page: undefined as Page + page: undefined as Page, + logger: undefined as Logger }; \ No newline at end of file diff --git a/src/test/pages/AccountRegister.ts b/src/test/pages/AccountRegister.ts index 9149579..391bba0 100644 --- a/src/test/pages/AccountRegister.ts +++ b/src/test/pages/AccountRegister.ts @@ -3,6 +3,7 @@ import { pageFixture } from "../hooks/pageFixture"; import { PageElement } from "../resources/interfaces/iPageElement"; import * as registrationPageLocators from "../resources/registrationPage.json"; import { LoginUser } from "./UserLogin"; +import winston from "winston"; function getResource(resourceName: string) { return registrationPageLocators.webElements.find((element: PageElement) => element.elementName == resourceName) as PageElement; @@ -30,6 +31,7 @@ export class AccountRegister { public async visitWebPage ():Promise { await pageFixture.page.goto('https://magento.softwaretestingboard.com/'); + pageFixture.logger.info('Navigated to the webpage - SELF WRITTEN.') }; public async assertAccPage ():Promise { diff --git a/src/test/steps/registerUser.ts b/src/test/steps/registerUser.ts index 175a76e..739aa4b 100644 --- a/src/test/steps/registerUser.ts +++ b/src/test/steps/registerUser.ts @@ -1,4 +1,4 @@ -import {Given, When, Then, setDefaultTimeout } from '@cucumber/cucumber'; +import { Given, When, Then, setDefaultTimeout } from '@cucumber/cucumber'; import { AccountRegister } from '../pages/AccountRegister'; import { pageFixture } from '../hooks/pageFixture'; From 814f752b43bacf50bc9ba27f77e5594ba4027c15 Mon Sep 17 00:00:00 2001 From: najeeb1023 Date: Thu, 20 Jun 2024 23:24:49 +0200 Subject: [PATCH 3/5] winston logger WIP --- logger/logger.ts | 36 ++++++++++++++++++------------------ playwright.config.ts | 7 +++++-- src/test/hooks/hooks.ts | 7 ++++--- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/logger/logger.ts b/logger/logger.ts index 583e76b..7b6994b 100644 --- a/logger/logger.ts +++ b/logger/logger.ts @@ -1,20 +1,20 @@ -import { transports, format } from "winston"; -import winston from "winston"; +import { createLogger, format, transports } from 'winston'; -const customFormat = winston.format.printf(({ level, message, timestamp }) => { - return `${timestamp} [${level}]: ${message}`; - }); +const { combine, timestamp, printf } = format; -export function options(scenarioName: string){ - return { - transports: [ - new transports.File({ - filename: `test-results/logs/${scenarioName}/log.log`, - level: 'info', - format: format.combine( - customFormat - ) - }), - ] - }; -}; \ No newline at end of file +const customFormat = printf(({ level, message, timestamp }) => { + return ` [${timestamp}] ${level}: ${message}`; +}); + +const logger = createLogger({ + level: 'info', + format: combine( + timestamp(), + customFormat + ), + transports: [ + new transports.Console() + ] +}); + +export default logger; \ No newline at end of file diff --git a/playwright.config.ts b/playwright.config.ts index c4664b0..951fc88 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,4 +1,5 @@ import { LaunchOptions } from "@playwright/test"; +import logger from './logger/logger' export const config: LaunchOptions = { timeout: 600000, @@ -6,7 +7,9 @@ export const config: LaunchOptions = { args:['--start-maximized'], slowMo: 300, logger: { - isEnabled: (name, severity) => true, - log: (name, severity, message, args) => console.log(`name = ${name} \n msg = ${message} \n severity = ${severity}`) + isEnabled: (name, severity) => name === 'api', + log: (name, timestamp, message, status) => { + logger.info(`[${name}] [${timestamp}] [${message}] [${status}]`) + }, } } \ No newline at end of file diff --git a/src/test/hooks/hooks.ts b/src/test/hooks/hooks.ts index 5b59d94..660c434 100644 --- a/src/test/hooks/hooks.ts +++ b/src/test/hooks/hooks.ts @@ -3,7 +3,7 @@ import { Browser, BrowserContext, chromium } from "@playwright/test"; import { config } from "../../../playwright.config"; import { pageFixture } from "./pageFixture"; import { createLogger } from "winston"; -import { options } from "../../../logger/logger"; +import logger from '../../../logger/logger' let browser: Browser; let context: BrowserContext; @@ -13,11 +13,12 @@ BeforeAll(async function () { }); Before(async function ({ pickle }) { - const scenarioName = pickle.name + pickle.id; + // const scenarioName = pickle.name + pickle.id; context = await browser.newContext({viewport: null}); const page = await context.newPage(); pageFixture.page = page; - pageFixture.logger = createLogger(options(scenarioName)); + pageFixture.logger = logger; + // pageFixture.logger = createLogger(options(scenarioName)); }); After(async function ({ pickle, result }) { From 8505421457650b595b1c369839ef7c5bd9915c2a Mon Sep 17 00:00:00 2001 From: najeeb1023 Date: Fri, 21 Jun 2024 00:17:01 +0200 Subject: [PATCH 4/5] winston logger, colorization added --- logger/logger.ts | 27 ++++++++++++++++++++++----- playwright.config.ts | 4 ++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/logger/logger.ts b/logger/logger.ts index 7b6994b..1be917f 100644 --- a/logger/logger.ts +++ b/logger/logger.ts @@ -1,19 +1,36 @@ import { createLogger, format, transports } from 'winston'; +import { allColors } from 'winston/lib/winston/config'; -const { combine, timestamp, printf } = format; +const { combine, timestamp, printf, colorize } = format; -const customFormat = printf(({ level, message, timestamp }) => { - return ` [${timestamp}] ${level}: ${message}`; +const customFormat = printf(({ timestamp, level, message }) => { + return ` [${timestamp}] ${level} ${message}`; }); const logger = createLogger({ level: 'info', format: combine( - timestamp(), + timestamp( + { + format: 'DD-M-YY HH:mm:ss' + } + ), + colorize(allColors), customFormat ), transports: [ - new transports.Console() + new transports.Console(), + new transports.File({ + filename: 'test-results/logs/log.log', + level: 'info', + format: format.combine( + timestamp({ + format: ' DD-M-YY HH:mm:ss' + }), + format.align(), + customFormat + ) + }) ] }); diff --git a/playwright.config.ts b/playwright.config.ts index 951fc88..bb5fb7a 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -8,8 +8,8 @@ export const config: LaunchOptions = { slowMo: 300, logger: { isEnabled: (name, severity) => name === 'api', - log: (name, timestamp, message, status) => { - logger.info(`[${name}] [${timestamp}] [${message}] [${status}]`) + log: (name, timestamp, message, ) => { + logger.info(`[${timestamp}] ${message}`) }, } } \ No newline at end of file From 23bfe748722609894e57bfad4b02db6ada948c7a Mon Sep 17 00:00:00 2001 From: najeeb1023 Date: Fri, 21 Jun 2024 14:44:28 +0200 Subject: [PATCH 5/5] BREAKING CHANGE: Added qavajs/console-formatter and winston logger for better results and debugging. --- config/cucumber.js | 8 ++- logger/logger.ts | 29 +++++----- package-lock.json | 92 +++++++++---------------------- package.json | 3 +- playwright.config.ts | 5 +- src/test/hooks/hooks.ts | 7 +-- src/test/pages/AccountRegister.ts | 1 + src/test/pages/UserLogin.ts | 10 +++- 8 files changed, 66 insertions(+), 89 deletions(-) diff --git a/config/cucumber.js b/config/cucumber.js index 394faf4..3c5ccf2 100644 --- a/config/cucumber.js +++ b/config/cucumber.js @@ -9,7 +9,7 @@ module.exports = { theme: { ...DEFAULT_THEME, 'step status': ['red'], - 'step text': ['white'], + 'step text': ['green'], 'feature description': ['white', 'italic'], 'feature keyword': ['cyan', 'bold'], 'feature name': ['white', 'underline'], @@ -19,6 +19,10 @@ module.exports = { 'step keyword': ['green'], 'step status': ['bold', 'red'], }, + console: { + showLogs: true, + showProgress: false + } }, compilerOptions: { esModuleInterop: true, @@ -38,7 +42,7 @@ module.exports = { format: [ "html:test-results/reports/cucumber-report.html", "json:test-results/reports/cucumber-report.json", - "@cucumber/pretty-formatter" + "@qavajs/console-formatter" ], }, }; \ No newline at end of file diff --git a/logger/logger.ts b/logger/logger.ts index 1be917f..da69d38 100644 --- a/logger/logger.ts +++ b/logger/logger.ts @@ -3,25 +3,26 @@ import { allColors } from 'winston/lib/winston/config'; const { combine, timestamp, printf, colorize } = format; -const customFormat = printf(({ timestamp, level, message }) => { +const createCustomLogger = (scenarioName: string) => { + const customFormat = printf(({ timestamp, level, message }) => { return ` [${timestamp}] ${level} ${message}`; -}); + }); -const logger = createLogger({ - level: 'info', - format: combine( + return createLogger({ + level: 'info', + format: combine( timestamp( { - format: 'DD-M-YY HH:mm:ss' + format: 'DD-M-YY HH:mm:ss', } ), colorize(allColors), customFormat ), - transports: [ + transports: [ new transports.Console(), new transports.File({ - filename: 'test-results/logs/log.log', + filename: `test-results/logs/${scenarioName}/log.log`, level: 'info', format: format.combine( timestamp({ @@ -29,9 +30,11 @@ const logger = createLogger({ }), format.align(), customFormat - ) - }) - ] -}); + ), + }), + ], + }); -export default logger; \ No newline at end of file +}; + +export default createCustomLogger; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4b6eb7e..1622f15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,11 @@ "license": "ISC", "devDependencies": { "@cucumber/cucumber": "^10.8.0", - "@cucumber/pretty-formatter": "^1.0.1", "@playwright/test": "^1.44.1", + "@qavajs/console-formatter": "^0.7.2", "@semantic-release/git": "^10.0.1", "@semantic-release/github": "^10.0.3", "@types/node": "^20.14.2", - "cucumber-console-formatter": "^1.0.0", "semantic-release": "^24.0.0", "ts-node": "^10.9.2", "winston": "^3.13.0" @@ -328,36 +327,6 @@ "uuid": "9.0.1" } }, - "node_modules/@cucumber/pretty-formatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-1.0.1.tgz", - "integrity": "sha512-A1lU4VVP0aUWdOTmpdzvXOyEYuPtBDI0xYwYJnmoMDplzxMdhcHk86lyyvYDoMoPzzq6OkOE3isuosvUU4X7IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^5.0.0", - "cli-table3": "^0.6.0", - "figures": "^3.2.0", - "ts-dedent": "^2.0.0" - }, - "peerDependencies": { - "@cucumber/cucumber": ">=7.0.0", - "@cucumber/messages": "*" - } - }, - "node_modules/@cucumber/pretty-formatter/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@cucumber/tag-expressions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.1.0.tgz", @@ -742,6 +711,19 @@ "node": ">=12" } }, + "node_modules/@qavajs/console-formatter": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@qavajs/console-formatter/-/console-formatter-0.7.2.tgz", + "integrity": "sha512-KGHWjvYYnZ4j4d/py15MB1qbiA/htKGZp88pCMTUGNXevTx/cuHgO2nCEhnaNKqejkWTRUMWwOiSUCRrOOt51w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "cli-progress": "^3.12.0", + "cli-table3": "^0.6.3", + "figures": "^3.2.0" + } + }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -1253,13 +1235,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/lodash": { - "version": "4.14.167", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz", - "integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { "version": "20.14.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", @@ -1769,6 +1744,19 @@ "node": ">=10" } }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/cli-table3": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", @@ -2084,22 +2072,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cucumber-console-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cucumber-console-formatter/-/cucumber-console-formatter-1.0.0.tgz", - "integrity": "sha512-2DtwlLDE+URsh6/optsjH4/JLF01p9pkBMxBhH702neUrtU/FXm9FEyBYqhg5355MIq2FgEdRB3AcoVfBxO8hw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@types/lodash": "4.14.167" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "@cucumber/cucumber": ">= 7.0.0" - } - }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -8831,16 +8803,6 @@ "node": ">= 14.0.0" } }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", diff --git a/package.json b/package.json index b22bb20..45827fe 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,11 @@ "description": "", "devDependencies": { "@cucumber/cucumber": "^10.8.0", - "@cucumber/pretty-formatter": "^1.0.1", "@playwright/test": "^1.44.1", + "@qavajs/console-formatter": "^0.7.2", "@semantic-release/git": "^10.0.1", "@semantic-release/github": "^10.0.3", "@types/node": "^20.14.2", - "cucumber-console-formatter": "^1.0.0", "semantic-release": "^24.0.0", "ts-node": "^10.9.2", "winston": "^3.13.0" diff --git a/playwright.config.ts b/playwright.config.ts index bb5fb7a..0c4de84 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,5 +1,8 @@ import { LaunchOptions } from "@playwright/test"; -import logger from './logger/logger' +import createCustomLogger from "./logger/logger"; + +let scenarioName; +const logger = createCustomLogger(scenarioName); export const config: LaunchOptions = { timeout: 600000, diff --git a/src/test/hooks/hooks.ts b/src/test/hooks/hooks.ts index 660c434..dc268c5 100644 --- a/src/test/hooks/hooks.ts +++ b/src/test/hooks/hooks.ts @@ -2,8 +2,7 @@ import { After, AfterAll, Before, BeforeAll, Status } from "@cucumber/cucumber"; import { Browser, BrowserContext, chromium } from "@playwright/test"; import { config } from "../../../playwright.config"; import { pageFixture } from "./pageFixture"; -import { createLogger } from "winston"; -import logger from '../../../logger/logger' +import createCustomLogger from "../../../logger/logger"; let browser: Browser; let context: BrowserContext; @@ -13,11 +12,11 @@ BeforeAll(async function () { }); Before(async function ({ pickle }) { - // const scenarioName = pickle.name + pickle.id; + const scenarioName = pickle.name + pickle.id; context = await browser.newContext({viewport: null}); const page = await context.newPage(); pageFixture.page = page; - pageFixture.logger = logger; + pageFixture.logger = createCustomLogger(scenarioName) // pageFixture.logger = createLogger(options(scenarioName)); }); diff --git a/src/test/pages/AccountRegister.ts b/src/test/pages/AccountRegister.ts index 391bba0..8ad3d57 100644 --- a/src/test/pages/AccountRegister.ts +++ b/src/test/pages/AccountRegister.ts @@ -37,6 +37,7 @@ export class AccountRegister { public async assertAccPage ():Promise { await this.registrationPageLocators.createAnAccountBtn().click(); await expect(this.registrationPageLocators.createAccHeading()).toHaveText('Create New Customer Account'); + }; public async enterUserDetails(firstname: string, lastname: string, email: string, password: string):Promise { diff --git a/src/test/pages/UserLogin.ts b/src/test/pages/UserLogin.ts index b5ba72e..0a94d99 100644 --- a/src/test/pages/UserLogin.ts +++ b/src/test/pages/UserLogin.ts @@ -31,7 +31,13 @@ export class LoginUser { await this.userLoginLocators.signInUserBtn().first().click(); }; - public async assertUserIsLoggedIn():Promise{ - await expect(this.userLoginLocators.welcomeMessage()).toContainText('Welcome'); + public async assertUserIsLoggedIn():Promise{ + if (expect(this.userLoginLocators.welcomeMessage()).toContainText('Welcome')){ + pageFixture.logger.info('User is logged in.') + } else { + pageFixture.logger.error('User is not logged in.') + } + + }; }; \ No newline at end of file