Karate testcases for fetch and update service [duplicate] - karate

Consider there are 100 scenarios and I want to run 99 scenarios in prod environment and 100 on stage environment .
Is there a way to achieve this in karate ?
Things I tried
1. Create a feature file with 1 scenario and another feature file with remaining 99
2. Add tag to the 1 scenario file
3. Ignore that while running
But then when I use it in jenkins job I have to run one command to run on both machines so would not work

The best solution for this case is the karate.abort() API:
So in the "special" scenario #100 - you can do this:
Scenario:
* eval if (karate.env == 'prod') karate.abort()
# normal scenario steps
Please note that there are advanced options for tag selectors in Karate 0.9.0 onwards - but just stick to the solution above please :)

Tag the 100th scenario with #hundred and just run the following command when you want to run 99 scenarios
mvn test -Dkarate.options="--tags ~#hundred"
And simply run mvn test when you want to run all tests.
You can tag a scenario
#hundred
Scenario: the scenario only played in one case
Given <...>
But you can also tag a Feature
#hundred
Feature: The feature containing the scenario only played in one case
Background:
* <..>
Scenario: <...>
Edit after your answer :
You could use a second runtime variable :
mvn test -Dkarate.options="--tags ~#{variable2}" -Dkarate.env={variable}
Or even use the same runtime variable :
mvn test -Dkarate.options="--tags ~#{variable}" -Dkarate.env={variable}
And that maybe wouldn't be the best solution, but you can add #Prod to the 99 scenarios, and #Stage to all of them, and switch the command to this :
mvn test -Dkarate.options="--tags #{variable}" -Dkarate.env={variable}
It's a bit longer to do, but at least the tag(s) on each feature/scenario will correspond to the case(s) in which they are launched

Related

Cucumber 7 tags understanding

Recently upgraded to Cucumber 7 and upon trying to run by tags as
mvn clean test -D"cucumber.filter.tags=#regression and not #slow and not #exclude and not #legacy"
and upon checking report, some features were not picked up
Example
#payrules #clean
Feature: xxxxxxxxxx
#regression
Scenario: xxxxxxx
Given xxxxxx
And xxxxxxxxx
upon reading https://cucumber.io/docs/cucumber/api/?sbsearch=tag&lang=java#tags, this scenario should be picked up, but yet got skipped
did something changed and only one set of tags can be set on scenario or feature level?
Please move the double quotes after cucumber.filter.tags:
mvn clean test -Dcucumber.filter.tags="#regression and not #slow and not #exclude and not #legacy"

karate api testing - How to read tag names from command line to feature file

karate api testing - How to read tag names from command line to feature file
My feature file
Feature: validating tag name reading from maven command line
Background:
Given url baseURL
When param validation = I want to read tagname here
Then method get
Then status 200
#com_status #all #I want to read tagname here
Scenario Outline: Testing tag input scenarios
print I want to read tagname here
Command - mvn clean test -Dtest=Runner -DargLine="-Dkarate.env=dev" -Dcucumber.options="--tags #com_status"
Below is the command to execute the tag from the command line in Karate Api automation testing.
mvn test -DargLine="-Dkarate.env=e2e" "-Dkarate.options=--tags #user_management_get_vender_types"
You cannot. Tags are designed to be passed on the command line to filter scenarios to run - and cannot be retrieved within a test. You can retrieve the tag of a Scenario though: https://github.com/intuit/karate#karate-tags
You can try using karate.properties or something similar to retrieve what was passed on the command-line: https://github.com/intuit/karate#dynamic-port-numbers
Command:
mvn clean test -DcustomName=foo
Feature:
* def customName = karate.properties['customName']
Feel free to contribute this feature if you think it is important.
EDIT - update in 1.1.0 onwards, there is a new feature "Exvironment Tags" that may solve what is being asked for here: https://github.com/intuit/karate#environment-tags
Also see: https://stackoverflow.com/a/50693388/143475

Is it possible to include and exclude via tags on the same karate command line

We can select multiple scenario's by including the following on the command line:
-Dcucumber.options="--tags #S1,#S2,#S6"
And if I want to exclude #S6 I can with:
-Dcucumber.options="--tags ~#S6"
But if I want to include #S1, #S2 and exclude #S6 all tags are ignored with:
-Dcucumber.options="--tags #S1,#S2,~#S6"
and all tags are also ignored if I try to double up on the options with:
-Dcucumber.options="--tags #S1,#S2" -Dcucumber.options="--tags ~#S6"
Is there a command line way to include and exclude in the one command line?
The reason I would like to do this is to run all of a type of test but exclude tests that use some external system that may be down temporarily.
EDIT: Turns out I was not fully aware of the difference between AND and OR in the Cucumber world. This SO answer and this article was a good reference, look for "Logical OR" and "Logical AND":
so to run S1 OR S2 AND NOT S3
mvn test -Dkarate.options="--tags #S1,#S2 --tags ~#S3"
Using the Java (or Runner) API, just use commas for OR and separate strings for AND:
Results results = Runner.path("classpath:com/myco/some.feature")
.tags("#S1,#S2", "~#S3")
.parallel(5);
For really advanced cases, also see: https://stackoverflow.com/a/67224240/143475

How to run single cucumber scenario by name

I'm asking for help on how to run a feature file scenario just by name. I've been trying for a while and it does not come out. I know that can be done by tags or by line number, but I wonder if we can run a cucumber test by name, more or less with this nomenclature.
Given a file named "features/test.feature" with:
Feature:
Scenario: My first scenario
Given this step is blah blah blah
Scenario: My second scenario
Given this step too blah blah
I want to run a scenario by name from the console or with gradle, maybe similar this way
cucumber features/test.feuture::My second scenario
Or maybe with gradle
./gradlew cucumber::My second scenario
You didn't describe how you start cucumber so I can't help you with that.
When used from the CLI accepts --name REGEXP. This will only run scenarios whose names match REGEXP.
The #CucumberOptions annotation accepts name="REGEXP".
Cucumber < v6.0.0 looks at the environment. For maven you can add -Dcucumber.options=--name REGEXP. I don't know the equivalent for gradle. Take note that the escape characters maybe shell/build system dependent.
Cucumber v6.0.0 and above looks at the environment. For maven you can add -Dcucumber.filter.name="REGEXP".
See:
https://cucumber.io/docs/reference/jvm#running
https://github.com/cucumber/cucumber-jvm/tree/main/core
From cucumber 6.x, you can run a scenario with below CLI commands:
// Specify a scenario by its line number
$ cucumber-js features/my_feature.feature:3
// Specify a scenario by its name matching a regular expression
$ cucumber-js --name "topic 1"
But, these are time-consuming and repetitive. You can save a lot of time by using a dedicated VSCode Extension called Cucumber-Quick. This extension will allow you to run a scenario/feature just by right-clicking on them. It can save you from all the hustle.
You would call the scenario by its line number.
So assuming that the second scenario starts on line 5 in your feature file you could run:
cucumber features/test.feature:5

IntelliJ Idea + cucumber run configuration: how to exclude #tags

Good news everyone.
I don't know how to exclude several tags within my run configuration for Cucumber project.
For instance, i have three tests.
#debug
Scenario outline: foo 1
When step
Then step
#obsolete
Scenario outline: foo 2
When step
Then step
#stable
Scenario outline: foo 3
When step
Then step
I put ~#debug,~#obsolete to the textbox called «Tags Filter» of the «Run configuration» dialog window.
But there's something wrong because when I start my tests — foo 1, foo 2 and foo 3 are starting anyways.
I have found the answer to this question within a comment to another stackoverflow question: https://stackoverflow.com/a/23743258.
Basically to add several tags to IntelliJ you need to add -Dcucumber.options="--tags ~#debug --tags ~#obsolete" to the VM options in the default cucumber settings.
For IntelliJ: Add below to the VM options by editing configuration
-Dcucumber.options="--tags #debug"
I don't know about IntelliJ, but on a terminal you would run:
cucumber --tags ~#debug --tags ~#obsolete
Specyfing --tags <your_tag_name> as Program arguments in the Cucumber run cofiguration resolved the issue in my case.
Add tags in cucumber options
#CucumberOptions(plugin = {"pretty"}, tags = {"#Runme"}, features = "src/test/resources/urpath", glue = "your.path")
Hence #CucumberOptions is obsolete with JUnit5 you have to use
#ExcludeTags({ "debug", "obsolete" })
instead.