From 9e835cb59a36a02f41a46b4a6eee44b5aaac4f32 Mon Sep 17 00:00:00 2001 From: depapp Date: Fri, 30 Aug 2024 16:48:24 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20another=20big=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 17 +-- package-lock.json | 13 +- package.json | 8 +- src/cli.js | 4 +- src/main.js | 11 ++ ...authentication.feature => example.feature} | 0 templates/english/features/support/steps.js | 5 +- templates/english/package.json | 2 +- templates/hindi/package.json | 2 +- .../features/contoh-autentikasi.feature | 97 -------------- templates/indonesian/features/contoh.feature | 83 +++++++++++- .../indonesian/features/support/steps.js | 9 ++ templates/indonesian/package.json | 2 +- templates/javanese/config/cucumber.json | 6 + templates/javanese/features/contone.feature | 81 ++++++++++++ templates/javanese/features/support/data.js | 11 ++ .../javanese/features/support/defaults.js | 6 + templates/javanese/features/support/steps.js | 120 ++++++++++++++++++ templates/javanese/package.json | 26 ++++ templates/korean/package.json | 2 +- 20 files changed, 373 insertions(+), 132 deletions(-) rename templates/english/features/{example-authentication.feature => example.feature} (100%) delete mode 100644 templates/indonesian/features/contoh-autentikasi.feature create mode 100644 templates/javanese/config/cucumber.json create mode 100644 templates/javanese/features/contone.feature create mode 100644 templates/javanese/features/support/data.js create mode 100644 templates/javanese/features/support/defaults.js create mode 100644 templates/javanese/features/support/steps.js create mode 100644 templates/javanese/package.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6bd171c..8bc1eaa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,8 +13,7 @@ jobs: strategy: matrix: - node-version: [14.x, 20.x, 22.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + node-version: [14.x, 20.x] steps: - name: checkout @@ -39,23 +38,11 @@ jobs: - name: install dependencies run: npm install - continue-on-error: ${{ matrix.node-version == '22.x' }} - - - name: check for unsupported engine warning - if: matrix.node-version == '22.x' - run: | - npm install 2>&1 | tee npm-install.log | grep "npm warn EBADENGINE Unsupported engine" - if [ $? -ne 0 ]; then - echo "Expected engine warning not found" - exit 1 - fi - name: symlink using npm-link run: npm link - if: matrix.node-version != '22.x' - name: run pusakatest run: | node -v - pusakatest -y - if: matrix.node-version != '22.x' \ No newline at end of file + pusakatest -y \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 09eaaee..db13af6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,17 @@ { "name": "pusakatest", - "version": "2.3.0", + "version": "2.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pusakatest", - "version": "2.3.0", + "version": "2.4.0", "license": "MIT", "dependencies": { "arg": "^4.1.0", "chalk": "^2.4.2", + "clear": "^0.1.0", "esm": "^3.2.25", "execa": "^1.0.0", "figlet": "^1.5.2", @@ -126,6 +127,14 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, + "node_modules/clear": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", + "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==", + "engines": { + "node": "*" + } + }, "node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", diff --git a/package.json b/package.json index a4b026b..b72d85d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pusakatest", - "version": "2.3.0", + "version": "2.4.0", "description": "pusakatest is an automation testing tool based on pactum using bdd (cucumber) style", "main": "index.js", "bin": "bin/create-project", @@ -23,6 +23,7 @@ "dependencies": { "arg": "^4.1.0", "chalk": "^2.4.2", + "clear": "^0.1.0", "esm": "^3.2.25", "execa": "^1.0.0", "figlet": "^1.5.2", @@ -62,8 +63,5 @@ "test", "http", "GraphQL" - ], - "engines": { - "node": ">=14 <=20" - } + ] } diff --git a/src/cli.js b/src/cli.js index 2bcfa05..a580e91 100644 --- a/src/cli.js +++ b/src/cli.js @@ -22,7 +22,7 @@ function parseArgumentsIntoOptions(rawArgs) { } async function promptForMissingOptions(options) { - const defaultTemplate = 'indonesian'; + const defaultTemplate = 'english'; if (options.skipPrompts) { return { ...options, @@ -36,7 +36,7 @@ async function promptForMissingOptions(options) { type: 'list', name: 'template', message: 'what language/localisation do you want to use?', - choices: ['indonesian', 'english', 'korean', 'hindi'], + choices: ['english', 'indonesian', 'javanese', 'korean', 'hindi'], default: defaultTemplate, }); } diff --git a/src/main.js b/src/main.js index cdb58fa..51b4bec 100644 --- a/src/main.js +++ b/src/main.js @@ -7,6 +7,7 @@ import path from 'path'; import { projectInstall } from 'pkg-install'; import { promisify } from 'util'; import figlet from 'figlet'; +import clear from 'clear'; const access = promisify(fs.access); const writeFile = promisify(fs.writeFile); @@ -45,6 +46,14 @@ export async function createProject(options) { title: 'create project', task: () => copyTemplateFiles(options), }, + { + title: 'create .gitignore', + task: async () => { + const gitignoreContent = 'node_modules/\ncucumber-report.html'; + const gitignorePath = path.join(options.targetDirectory, '.gitignore'); + await writeFile(gitignorePath, gitignoreContent); + }, + }, { title: 'install dependencies', task: () => @@ -59,6 +68,7 @@ export async function createProject(options) { ); await tasks.run(); + clear(); figlet(`pusakatest`, (err, data) => { console.log((data) + '\n'); console.log( @@ -66,6 +76,7 @@ export async function createProject(options) { ` is ready to use. just run `+chalk.green(`npm run test`) ) ); + console.log(''); }); return true; } diff --git a/templates/english/features/example-authentication.feature b/templates/english/features/example.feature similarity index 100% rename from templates/english/features/example-authentication.feature rename to templates/english/features/example.feature diff --git a/templates/english/features/support/steps.js b/templates/english/features/support/steps.js index 70b3253..5771d80 100644 --- a/templates/english/features/support/steps.js +++ b/templates/english/features/support/steps.js @@ -111,9 +111,8 @@ Then(/^I expect response should contain a json$/, function (json) { }) Then('I log the response body', async function () { - const response = await spec.toss().then((res) => res.json); - console.log(response); - this.attach(JSON.stringify(response, null, 2), 'application/json'); + const response = await spec.toss().then((res) => res.json) + this.attach(JSON.stringify(response, null, 2), 'application/json') }); After(() => { diff --git a/templates/english/package.json b/templates/english/package.json index 3a33058..f7ef696 100644 --- a/templates/english/package.json +++ b/templates/english/package.json @@ -1,6 +1,6 @@ { "name": "pusakatest", - "version": "2.3.0", + "version": "2.4.0", "description": "pusakatest is an automation testing tool based on pactum using bdd (cucumber) style", "main": "index.js", "scripts": { diff --git a/templates/hindi/package.json b/templates/hindi/package.json index 4d115f9..f7ef696 100644 --- a/templates/hindi/package.json +++ b/templates/hindi/package.json @@ -1,6 +1,6 @@ { "name": "pusakatest", - "version": "2.2.3", + "version": "2.4.0", "description": "pusakatest is an automation testing tool based on pactum using bdd (cucumber) style", "main": "index.js", "scripts": { diff --git a/templates/indonesian/features/contoh-autentikasi.feature b/templates/indonesian/features/contoh-autentikasi.feature deleted file mode 100644 index be1d763..0000000 --- a/templates/indonesian/features/contoh-autentikasi.feature +++ /dev/null @@ -1,97 +0,0 @@ -Fitur: Autentikasi pada ADEQUATESHOP API - - Contoh Automation API untuk fitur Autentikasi - - Skenario: Registrasi Pengguna Baru Menggunakan Data Yang Sudah Ada - Dengan Saya melakukan metode "POST" request pada "http://restapi.adequateshop.com/api/authaccount/registration" - Dan Saya set data untuk body menggunakan - """ - { - "name": "PactumJS 01", - "email": "pactumjs01@gmail.com", - "password": 123456 - } - """ - Ketika Saya menerima sebuah response API - Maka Saya mengharapkan status code response API nya "200" - Dan Saya mengharapkan response API nya memiliki json - """ - { - "code": 1, - "message": "The email address you have entered is already registered", - "data": null - } - """ - - Skenario: Registrasi Pengguna Baru Menggunakan Data Yang Tidak Sah (Invalid) - Dengan Saya melakukan metode "POST" request pada "http://restapi.adequateshop.com/api/authaccount/registration" - Dan Saya set data untuk body menggunakan - """ - { - "name": "PactumJS XXX", - "email": "pactumjsxxx", - "password": 123456 - } - """ - Ketika Saya menerima sebuah response API - Maka Saya mengharapkan status code response API nya "400" - Dan Saya mengharapkan response API nya memiliki json pada "ModelState" - """ - { - "User.email": [ - "Enter valid email address" - ] - } - """ - - Skenario: Pengguna Melakukan Login dengan Data Yang Sah (Valid) - Dengan Saya melakukan metode "POST" request pada "http://restapi.adequateshop.com/api/authaccount/login" - Dan Saya set data untuk body menggunakan - """ - { - "email": "pactumjs001@gmail.com", - "password": 123456 - } - """ - Ketika Saya menerima sebuah response API - Maka Saya mengharapkan status code response API nya "200" - Dan Saya mengharapkan response API nya memiliki schema json pada "data" - """ - { - "type": "object", - "properties": { - "Id": { - "type": "integer" - }, - "Name": { - "type": "string" - }, - "Email": { - "type": "string" - }, - "Token": { - "type": "string" - } - } - } - """ - - Skenario: Pengguna Melakukan Login dengan Data Yang Tidak Sah (Invalid) - Dengan Saya melakukan metode "POST" request pada "http://restapi.adequateshop.com/api/authaccount/login" - Dan Saya set data untuk body menggunakan - """ - { - "email": "invalidaccount@email.com", - "password": 111222333 - } - """ - Ketika Saya menerima sebuah response API - Maka Saya mengharapkan status code response API nya "200" - Dan Saya mengharapkan response API nya memiliki json - """ - { - "code": 1, - "message": "invalid username or password", - "data": null - } - """ diff --git a/templates/indonesian/features/contoh.feature b/templates/indonesian/features/contoh.feature index dad1932..9ead74c 100644 --- a/templates/indonesian/features/contoh.feature +++ b/templates/indonesian/features/contoh.feature @@ -1,6 +1,81 @@ -Fitur: API REQRES.IN +Fitur: DummyJSON API - Skenario: Menampilkan daftar user pada API REQRES.IN - Dengan Saya melakukan metode "GET" request pada "https://reqres.in/api/users" + Otomasi API dengan DummyJSON API + + Skenario: Login pengguna menggunakan Kredensial yang Sah + Ketika Saya melakukan metode "POST" request pada "https://dummyjson.com/auth/login" + Dan Saya set data untuk body menggunakan + """ + { + "username": "emilys", + "password": "emilyspass" + } + """ + Ketika Saya menerima sebuah response API + Maka Saya mengharapkan status code response API nya "200" + Dan Saya mengharapkan response API nya berisi json + """ + { + "id": 1, + "email": "emily.johnson@x.dummyjson.com", + "username": "emilys", + "firstName": "Emily", + "lastName": "Johnson", + "gender": "female" + } + """ + + Skenario: Login pengguna menggunakan Kredensial Tidak Sah + Ketika Saya melakukan metode "POST" request pada "https://dummyjson.com/auth/login" + Dan Saya set data untuk body menggunakan + """ + { + "username": "notfounduser", + "password": "invalidpassword" + } + """ + Ketika Saya menerima sebuah response API + Maka Saya mengharapkan status code response API nya "400" + Dan Saya mengharapkan response API nya berisi json + """ + { + "message": "Invalid credentials" + } + """ + + Skenario: Tambah Pengguna Baru menggunakan Data yang Sah + Ketika Saya melakukan metode "POST" request pada "https://dummyjson.com/users/add" + Dan Saya set data untuk body menggunakan + """ + { + "firstName": "Ujang", + "lastName": "Tea", + "maidenName": "Jajang", + "age": 17, + "gender": "male", + "email": "ujang.jajang@x.dummyjson.com", + "phone": "+62 812-1234-1234", + "username": "ujangjajang", + "password": "123123123" + } + """ + Ketika Saya menerima sebuah response API + Maka Saya mengharapkan status code response API nya "201" + Dan Saya mencatat isi response body nya + + Skenario: Mendapatkan Data Pengguna Tunggal yang Sah + Ketika Saya melakukan metode "GET" request pada "https://dummyjson.com/users/1" + Ketika Saya menerima sebuah response API + Maka Saya mengharapkan status code response API nya "200" + Dan Saya mencatat isi response body nya + + Skenario: Mendapatkan Data Pengguna Tunggal yang Tidak Sah + Ketika Saya melakukan metode "GET" request pada "https://dummyjson.com/users/99999" Ketika Saya menerima sebuah response API - Maka Saya mengharapkan status code response API nya "200" \ No newline at end of file + Maka Saya mengharapkan status code response API nya "404" + Dan Saya mengharapkan response API nya berisi json + """ + { + "message": "User with id '99999' not found" + } + """ \ No newline at end of file diff --git a/templates/indonesian/features/support/steps.js b/templates/indonesian/features/support/steps.js index 0f9a28e..534058e 100644 --- a/templates/indonesian/features/support/steps.js +++ b/templates/indonesian/features/support/steps.js @@ -54,6 +54,15 @@ Then(/^Saya mengharapkan response API nya memiliki json pada "(.*)"$/, function spec.response().should.have.json(path, JSON.parse(value)) }) +Then(/^Saya mengharapkan response API nya berisi json$/, function (json) { + spec.response().should.have.jsonLike(JSON.parse(json)) +}) + +Then('Saya mencatat isi response body nya', async function () { + const response = await spec.toss().then((res) => res.json) + this.attach(JSON.stringify(response, null, 2), 'application/json') +}); + After(() => { spec.end() }) \ No newline at end of file diff --git a/templates/indonesian/package.json b/templates/indonesian/package.json index 4d115f9..f7ef696 100644 --- a/templates/indonesian/package.json +++ b/templates/indonesian/package.json @@ -1,6 +1,6 @@ { "name": "pusakatest", - "version": "2.2.3", + "version": "2.4.0", "description": "pusakatest is an automation testing tool based on pactum using bdd (cucumber) style", "main": "index.js", "scripts": { diff --git a/templates/javanese/config/cucumber.json b/templates/javanese/config/cucumber.json new file mode 100644 index 0000000..0ca3b21 --- /dev/null +++ b/templates/javanese/config/cucumber.json @@ -0,0 +1,6 @@ +{ + "default": { + "language": "jv", + "format": ["summary", "html:cucumber-report.html"] + } +} \ No newline at end of file diff --git a/templates/javanese/features/contone.feature b/templates/javanese/features/contone.feature new file mode 100644 index 0000000..ab545e3 --- /dev/null +++ b/templates/javanese/features/contone.feature @@ -0,0 +1,81 @@ +Fitur: DummyJSON API + + Otomasi API karo DummyJSON API + + Skenario: Login pangguna nggunakake Kredensial sing Sah + Nalika Kula nggawe panjalukan "POST" menyang "https://dummyjson.com/auth/login" + Lan Kula nyetel body dadi + """ + { + "username": "emilys", + "password": "emilyspass" + } + """ + Menawa Kula nampa response + Njuk Kula ngarepake response kudu duwe status "200" + Lan Kula ngarepake response kudu ngemot json + """ + { + "id": 1, + "email": "emily.johnson@x.dummyjson.com", + "username": "emilys", + "firstName": "Emily", + "lastName": "Johnson", + "gender": "female" + } + """ + + Skenario: Login pangguna nggunakake Kredensial Ora Sah + Nalika Kula nggawe panjalukan "POST" menyang "https://dummyjson.com/auth/login" + Lan Kula nyetel body dadi + """ + { + "username": "notfounduser", + "password": "invalidpassword" + } + """ + Menawa Kula nampa response + Njuk Kula ngarepake response kudu duwe status "400" + Lan Kula ngarepake response kudu duwe json + """ + { + "message": "Invalid credentials" + } + """ + + Skenario: Tambah Panganggo Anyar nggunakake Data sing Sah + Nalika Kula nggawe panjalukan "POST" menyang "https://dummyjson.com/users/add" + Lan Kula nyetel body dadi + """ + { + "firstName": "Ujang", + "lastName": "Tea", + "maidenName": "Jajang", + "age": 17, + "gender": "male", + "email": "ujang.jajang@x.dummyjson.com", + "phone": "+62 812-1234-1234", + "username": "ujangjajang", + "password": "123123123" + } + """ + Menawa Kula nampa response + Njuk Kula ngarepake response kudu duwe status "201" + Lan Kula cathet response body + + Skenario: Entuk Data Panganggo Tunggal sing Sah + Nalika Kula nggawe panjalukan "GET" menyang "https://dummyjson.com/users/1" + Menawa Kula nampa response + Njuk Kula ngarepake response kudu duwe status "200" + Lan Kula cathet response body + + Skenario: Entuk Data Panganggo Tunggal sing Ora Sah + Nalika Kula nggawe panjalukan "GET" menyang "https://dummyjson.com/users/99999" + Menawa Kula nampa response + Njuk Kula ngarepake response kudu duwe status "404" + Lan Kula ngarepake response kudu duwe json + """ + { + "message": "User with id '99999' not found" + } + """ \ No newline at end of file diff --git a/templates/javanese/features/support/data.js b/templates/javanese/features/support/data.js new file mode 100644 index 0000000..d6f92de --- /dev/null +++ b/templates/javanese/features/support/data.js @@ -0,0 +1,11 @@ +const { faker } = require('@faker-js/faker') + +const randomData = { + name: faker.person.fullName(), + email: faker.internet.email(), + password: faker.internet.password() +} + +module.exports = { + randomData +} \ No newline at end of file diff --git a/templates/javanese/features/support/defaults.js b/templates/javanese/features/support/defaults.js new file mode 100644 index 0000000..4ed7d99 --- /dev/null +++ b/templates/javanese/features/support/defaults.js @@ -0,0 +1,6 @@ +const { request, settings } = require('pactum') +const { Before } = require('@cucumber/cucumber') + +Before(() => { + settings.setReporterAutoRun(false) +}) diff --git a/templates/javanese/features/support/steps.js b/templates/javanese/features/support/steps.js new file mode 100644 index 0000000..2165404 --- /dev/null +++ b/templates/javanese/features/support/steps.js @@ -0,0 +1,120 @@ +const pactum = require('pactum') +const { Given, When, Then, Before, After } = require('@cucumber/cucumber') +const { randomData } = require('./data') + +let spec = pactum.spec() +let fakerData = { + "name": randomData.name, + "email": randomData.email, + "password": randomData.password +} + +Before(() => { + spec = pactum.spec() +}) + +Given(/^Kula nggawe panjalukan "(.*)" menyang "(.*)"$/, function (method, endpoint) { + spec[method.toLowerCase()](endpoint) +}) + +Given(/^Kula nyetel path param "(.*)" dadi "(.*)"$/, function (key, value) { + spec.withPathParams(key, value) +}) + +Given(/^Kula nyetel query param "(.*)" dadi "(.*)"$/, function (key, value) { + spec.withQueryParams(key, value) +}) + +Given(/^Kula nyetel kredensial otentikasi dhasar "(.*)" lan "(.*)"$/, function (username, password) { + spec.withAuth(username, password) +}) + +Given(/^Kula nyetel header "(.*)" dadi "(.*)"$/, function (key, value) { + spec.withHeaders(key, value) +}) + +Given(/Kula nyetel body dadi/, function (body) { + try { + spec.withJson(JSON.parse(body)) + } catch(error) { + spec.withBody(body) + } +}) + +Given('Kula nggunakake data tes acak kanggo nggawe Kulan', function () { + console.log(fakerData) + spec.withJson(fakerData) +}) + +Given(/^Kula ngunggah file ing "(.*)"$/, function (filePath) { + spec.withFile(filePath) +}) + +Given(/^Kula nyetel param formulir multi-bagian "(.*)" dadi "(.*)"$/, function (key, value) { + spec.withMultiPartFormData(key, value) +}) + +When('Kula nampa response', async function () { + await spec.toss() +}) + +Then('Kula ngarepake response kudu duwe status "{int}"', function (code) { + spec.response().should.have.status(code) +}) + +Then(/^Kula ngarepake header response "(.*)" kudu "(.*)"$/, function (key, value) { + spec.response().should.have.header(key, value) +}) + +Then(/^Kula ngarepake header response "(.*)" kudu duwe "(.*)"$/, function (key, value) { + spec.response().should.have.headerContains(key, value) +}) + +Then(/^Kula ngarepake response kudu duwe json$/, function (json) { + spec.response().should.have.json(JSON.parse(json)) +}) + +Then(/^Kula ngarepake response kudu duwe json ing "(.*)"$/, function (path, value) { + spec.response().should.have.json(path, JSON.parse(value)) +}) + +Then(/^Kula ngarepake response kudu duwe json kaya$/, function (json) { + spec.response().should.have.jsonLike(JSON.parse(json)) +}) + +Then(/^Kula ngarepake response kudu duwe json kaya ing "(.*)"$/, function (path, value) { + spec.response().should.have.jsonLike(path, JSON.parse(value)) +}) + +Then(/^Kula ngarepake response kudu duwe skema json$/, function (json) { + spec.response().should.have.jsonSchema(JSON.parse(json)) +}) + +Then(/^Kula ngarepake response kudu duwe skema json ing "(.*)"$/, function (path, value) { + spec.response().should.have.jsonSchema(path, JSON.parse(value)) +}) + +Then(/^Kula ngarepake response kudu duwe body$/, function (body) { + spec.response().should.have.body(body) +}) + +Then('Kula ngarepake response kudu duwe "{string}"', function (handler) { + spec.response().should.have._(handler) +}) + +Then(/^Kula nyimpen response ing "(.*)" minangka "(.*)"$/, function (path, name) { + spec.stores(name, path) +}) + +Then(/^Kula ngarepake response kudu ngemot json$/, function (json) { + spec.response().should.have.jsonLike(JSON.parse(json)) +}) + +Then('Kula cathet response body', async function () { + const response = await spec.toss().then((res) => res.json); + this.attach(JSON.stringify(response, null, 2), 'application/json'); +}); + +After(() => { + spec.end() +}) diff --git a/templates/javanese/package.json b/templates/javanese/package.json new file mode 100644 index 0000000..f7ef696 --- /dev/null +++ b/templates/javanese/package.json @@ -0,0 +1,26 @@ +{ + "name": "pusakatest", + "version": "2.4.0", + "description": "pusakatest is an automation testing tool based on pactum using bdd (cucumber) style", + "main": "index.js", + "scripts": { + "test": "cucumber-js --config config/cucumber.json", + "test-publish": "cucumber-js --config config/cucumber.json --publish" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/depapp/pusakatest.git" + }, + "author": "@depapp", + "license": "MIT", + "bugs": { + "url": "https://github.com/depapp/pusakatest/issues" + }, + "homepage": "https://github.com/depapp/pusakatest#readme", + "devDependencies": { + "@cucumber/cucumber": "latest", + "@faker-js/faker": "latest", + "mocha": "latest", + "pactum": "latest" + } +} diff --git a/templates/korean/package.json b/templates/korean/package.json index aa65910..15b050b 100644 --- a/templates/korean/package.json +++ b/templates/korean/package.json @@ -1,6 +1,6 @@ { "name": "pusakatest", - "version": "2.2.3", + "version": "2.4.0", "description": "pusakatest is an automation testing tool based on pactum using bdd (cucumber) style", "main": "index.js", "scripts": {