{"id":24122950,"url":"https://github.com/veepee-oss/gingerspec","last_synced_at":"2025-09-18T13:31:32.193Z","repository":{"id":40466246,"uuid":"181009709","full_name":"veepee-oss/gingerspec","owner":"veepee-oss","description":"Acceptance test library. General purpose automation framework.","archived":false,"fork":false,"pushed_at":"2023-12-21T12:39:00.000Z","size":6912,"stargazers_count":7,"open_issues_count":6,"forks_count":5,"subscribers_count":6,"default_branch":"master","last_synced_at":"2023-12-21T15:18:16.088Z","etag":null,"topics":["appium","cucumber","kafka","mongodb","mysql","postgresql","rest","selenium","testng"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/veepee-oss.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2019-04-12T13:04:22.000Z","updated_at":"2023-12-21T12:58:00.000Z","dependencies_parsed_at":"2023-12-21T14:36:54.615Z","dependency_job_id":null,"html_url":"https://github.com/veepee-oss/gingerspec","commit_stats":null,"previous_names":["privaliatech/gingerspec"],"tags_count":47,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veepee-oss%2Fgingerspec","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veepee-oss%2Fgingerspec/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veepee-oss%2Fgingerspec/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veepee-oss%2Fgingerspec/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/veepee-oss","download_url":"https://codeload.github.com/veepee-oss/gingerspec/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":233483071,"owners_count":18683016,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["appium","cucumber","kafka","mongodb","mysql","postgresql","rest","selenium","testng"],"created_at":"2025-01-11T12:33:47.838Z","updated_at":"2025-09-18T13:31:26.732Z","avatar_url":"https://github.com/veepee-oss.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n```  \n\n  /$$$$$$  /$$                                          /$$$$$$                               \n /$$__  $$|__/                                         /$$__  $$                              \n| $$  \\__/ /$$ /$$$$$$$   /$$$$$$   /$$$$$$   /$$$$$$ | $$  \\__/  /$$$$$$   /$$$$$$   /$$$$$$$\n| $$ /$$$$| $$| $$__  $$ /$$__  $$ /$$__  $$ /$$__  $$|  $$$$$$  /$$__  $$ /$$__  $$ /$$_____/\n| $$|_  $$| $$| $$  \\ $$| $$  \\ $$| $$$$$$$$| $$  \\__/ \\____  $$| $$  \\ $$| $$$$$$$$| $$      \n| $$  \\ $$| $$| $$  | $$| $$  | $$| $$_____/| $$       /$$  \\ $$| $$  | $$| $$_____/| $$      \n|  $$$$$$/| $$| $$  | $$|  $$$$$$$|  $$$$$$$| $$      |  $$$$$$/| $$$$$$$/|  $$$$$$$|  $$$$$$$\n \\______/ |__/|__/  |__/ \\____  $$ \\_______/|__/       \\______/ | $$____/  \\_______/ \\_______/\n                         /$$  \\ $$                              | $$                          \n                        |  $$$$$$/                              | $$                          \n                         \\______/                               |__/                          \n\n```\n[![GingerSpec pipeline](https://github.com/veepee-oss/gingerspec/actions/workflows/maven-build.yml/badge.svg)](https://github.com/veepee-oss/gingerspec/actions/workflows/maven-build.yml)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.privaliatech/gingerspec/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.privaliatech/gingerspec)\n[![License](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n![GitHub Release Date](https://img.shields.io/github/release-date/veepee-oss/gingerspec)\n[![javadoc](https://javadoc.io/badge2/com.github.privaliatech/gingerspec/javadoc.svg)](https://javadoc.io/doc/com.github.privaliatech/gingerspec)\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\u003ch2\u003eAcceptance Test library. General purpose automation framework.\u003c/h2\u003e\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"#project-introobjective\"\u003eIntro\u003c/a\u003e |\n    \u003ca href=\"#documentation\"\u003eDocumentation\u003c/a\u003e |\n    \u003ca href=\"#requirements\"\u003eRequirements\u003c/a\u003e |\n    \u003ca href=\"#technologies\"\u003eTechnologies\u003c/a\u003e |\n    \u003ca href=\"#using-gingerspec\"\u003eUsing GingerSpec\u003c/a\u003e |\n    \u003ca href=\"#aspects\"\u003eAspects\u003c/a\u003e |\n    \u003ca href=\"#steps\"\u003eSteps\u003c/a\u003e |\n    \u003ca href=\"#contributing-members-to-gingerspec\"\u003eContribute\u003c/a\u003e\n\u003c/p\u003e\n\n## Project Intro/Objective\nThe purpose of this project is to provide a generic BDT (behaviour driven testing) library with common BDD steps and extended gherkin language.\n\nGingerSpec provides common functionality that can be reused by different test projects, It encourages code reusability, as we test (in most of the cases) the same, it will help our QA Community to get our objectives much faster. It focuses on the reuse of actions (also steps or key tabs) that implement low level functionality and that can be organized to create much more complex features.\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/veepee-oss/gingerspec/wiki/resources/gingerspec_highlights.png\" alt=\"GingerSpec Highlights\"\u003e\n\u003c/div\u003e\n\n## Documentation\n* [Project wiki](https://github.com/veepee-oss/gingerspec/wiki)\n* [Steps documentation an examples](https://veepee-oss.github.io/gingerspec/)\n* [Javadoc](https://javadoc.io/doc/com.github.privaliatech/gingerspec/latest/index.html)  \n\n### Requirements\n* Java 8+\n* Maven 3+\n\n### Technologies\n* Cucumber for test definition   \n* TestNG for execution    \n* Selenium\n* Appium     \n* AssertJ\n* SQL (PostgreSQL, MySQL, Clickhouse)\n* rest-assured (Rest API testing)\n* GraphQl\n* Swagger (2.x, 3.x)\n* SSH support\n* Files manipulation\n* WebServices (SOAP)\n* Kafka \u0026 ZooKeeper\n\n## Using GingerSpec\n\nWe **strongly** suggest to make use of the special archetype for GingerSpec based projects: [gingerspec-starter](https://github.com/PrivaliaTech/gingerspec-starter). Just run the following command in your terminal (replace the values for groupId, version and artifactId as needed):\n\n``` \nmvn archetype:generate \\\n  -DarchetypeGroupId=com.github.privaliatech \\\n  -DarchetypeArtifactId=gingerspec-starter \\\n  -DgroupId=eu.vptech \\\n  -Dversion=1.0-SNAPSHOT \\\n  -DartifactId=myproject\n``` \n\nThis will create a ready-to-use project based on a template with best practices and examples that you can modify in the way you see fit for your needs\n\n\n## Aspects  \n  \nAs part of GingerSpec implementation, there are a couple of tags which may be useful for your scenarios:  \n\n### :envelope: Slack integration: \nSend a message to a Slack channel(s) when your scenario fails. [Read more](https://github.com/veepee-oss/gingerspec/wiki/Gherkin-tags#slack-tag).\n\n```gherkin\n@slack[#mychannel]\n    Scenario: A successful response with a valid body is returned\n        Given I securely send requests to 'jsonplaceholder.typicode.com:443'\n        When I send a 'GET' request to '/posts'\n        Then the service response status must be '200'\n```\n\n### :bar_chart: Jira integration\nUpdate tickets in jira based onn tests results and perform conditional execution based on status of tickets. [Read more](https://github.com/veepee-oss/gingerspec/wiki/Gherkin-tags#jira-tag).\n\n```gherkin\n@jira[QMS-990]\nScenario: A new element is inserted via a POST call\n    Given I send requests to '${REST_SERVER_HOST}:3000'\n    When I send a 'POST' request to '/posts' based on 'schemas/mytestdata.json' as 'json'\n    Then the service response status must be '201'\n```\n\n### :no_entry: Ignore scenarios\nEasily ignore scenarios using the @ignore tag. [Read more](https://github.com/veepee-oss/gingerspec/wiki/Gherkin-tags#ignore-tag).\n\n```gherkin\n  @ignore @toocomplex\n  Scenario: Ignored scenario (too complex)\n    Given I run '[ \"THIS SHOULDNT HAVE BEEN RUN\" = \"!UNEXISTANT_VAR\" ]' locally\n    Given I run 'exit 1' locally\n```\n\n### :gear: Use and create variables\nUse annd create variables directly in feature files. [Read more](https://github.com/veepee-oss/gingerspec/wiki/Gherkin-variables).\n\n````gherkin\n  Scenario: A new element is inserted via a POST call\n    Given I send requests to '${REST_SERVER_HOST}:3000'\n    When I send a 'POST' request to '/posts' based on 'schemas/mytestdata.json' as 'json'\n    Then the service response status must be '201'\n    And I save element '$.title' in environment variable 'TITLE'\n    Then '${TITLE}' matches 'This is a test'\n````\n\n### :arrows_counterclockwise: Conditional execution\nAllow the conditional execution of scenarios based on a given environment variable. [Read more](https://github.com/veepee-oss/gingerspec/wiki/Gherkin-tags#runonenv-tag).\n\n```gherkin\n@runOnEnv(SECS)\nScenario: Dummy scenario\n     And I wait '${SECS}' seconds\n\n@skipOnEnv(SECS_2)\nScenario: Dummy scenario\n    And I wait '${SECS}' seconds\n```\n\nAnd [many others more!](https://github.com/veepee-oss/gingerspec/wiki/Gherkin-tags) :yum:\n  \n## Steps\n\nGingerSpec contains tons of predefined Gherkin steps ready to use in your own features. The steps cover a wide range of functionality, from steps for testing Rest endpoints, perform front-end etsting using selenium, and even for testing kafka services!\n\n\n_[Testing Rest services](https://veepee-oss.github.io/gingerspec/steps-for-testing-rEST-aPIs.html)_\n```\n  Scenario: A successful response with a valid body is returned\n    Given I securely send requests to 'jsonplaceholder.typicode.com:443'\n    When I send a 'GET' request to '/posts'\n    Then the service response status must be '200'\n    And I save element '$.[0].userId' in environment variable 'USER_ID'\n    Then '${USER_ID}' matches '1'\n    \n  Scenario: Add the body to be sent directly\n    Given I securely send requests to 'jsonplaceholder.typicode.com:443'\n    When I send a 'POST' request to '/posts' with body\n        \"\"\"\n            {\n              \"userId\": 1,\n              \"title\": \"This is a test\",\n              \"body\": \"This is a test\"\n            }\n          \"\"\"\n    Then the service response status must be '201'\n```\n\n\n_[Testing a web page](https://veepee-oss.github.io/gingerspec/steps-for-testing-web-pages.html)_\n```\n  @web\n  Scenario: Fill the form and click the submit button\n    Given I go to 'http://demoqa.com/text-box'\n    And I type 'John' on the element with 'id:userName'\n    And I type 'john.smith@email.com' on the element with 'id:userEmail'\n    And I type '123 fake address' on the element with 'id:currentAddress'\n    When I scroll down until the element with 'id:submit' is visible\n    And I click on the element with 'id:submit'\n    Then at least '1' elements exists with 'id:output'\n```\n\n_[Testing database](https://veepee-oss.github.io/gingerspec/steps-for-testing-relational-databases.html)_\n```\n  Scenario: Executing SELECT statements on a MySQL database\n    Given I connect with JDBC to database 'mysql' type 'mysql' on host '${MYSQL_HOST}' and port '3306' with user 'root' and password 'mysql'\n    Then I execute query 'CREATE TABLE IF NOT EXISTS weather1 (city varchar(80), temp_lo int, temp_hi int, prcp real, date date);'\n    Then I execute query 'TRUNCATE weather1'\n    Then I execute query 'INSERT INTO weather1 (city, temp_lo, temp_hi, prcp, date) VALUES ('San Francisco', 15, 43, 0.0, '2004-11-29');'\n    Then I execute query 'INSERT INTO weather1 (city, temp_lo, temp_hi, prcp, date) VALUES ('Kyiv', 5, 37, 0.4, '2014-11-29');'\n    Then I execute query 'INSERT INTO weather1 (city, temp_lo, temp_hi, prcp, date) VALUES ('Paris', 8, 37, 0.4, '2016-11-30');'\n    When I query the database with 'SELECT * FROM weather1;'\n    Then I check that result is:\n      | city          | temp_lo | temp_hi | prcp | date       |\n      | San Francisco | 15      | 43      | 0.0  | 2004-11-29 |\n      | Kyiv          | 5       | 37      | 0.4  | 2014-11-29 |\n      | Paris         | 8       | 37      | 0.4  | 2016-11-30 |\n    Then I check that table 'weather1' is iqual to\n      | city          | temp_lo | temp_hi | prcp | date       |\n      | San Francisco | 15      | 43      | 0.0  | 2004-11-29 |\n      | Kyiv          | 5       | 37      | 0.4  | 2014-11-29 |\n      | Paris         | 8       | 37      | 0.4  | 2016-11-30 |\n\n```\n  \n\n[And many many more!](https://veepee-oss.github.io/gingerspec/index.html)  \n\n  \n## Contributing Members to GingerSpec\n\n**QA Team Lead: [Oleksandr Tarasyuk](https://github.com/alejandro2003) (@oleksandr.tarasyuk)**\n\n#### Other Members:\n\n|Name     |  Slack Handle   | \n|---------|-----------------|\n|[Jose Fernandez Duque](https://github.com/josefd8)| @josefd8        |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveepee-oss%2Fgingerspec","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fveepee-oss%2Fgingerspec","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveepee-oss%2Fgingerspec/lists"}