What's wrong with my robot framework teardown? - robotframework

I'm new to using robot framework and I'm struggling to get my teardown to work.
It currently looks like:
[Teardown] run keyword if any tests failed KeyFail
When I run the program with code like this, I get the error: Keyword 'Run Keyword If Any Tests Failed' can only be used in suite teardown.
I can change it so that I put it inside it's own test case, however I then get the error that: Test Case contains no keywords.
Please advise me as to what I'm doing wrong. It would be appreciated. Thanks.
Edit:
***Keywords***
Generation
(Some stuff)
KeyFail
log to console Error report being sent.
***Test Cases***
Requires successful generation of file
Generation
Teardown Case
[Teardown] run keyword if any tests failed KeyFail
Edit: And how to fix this problem. Thanks

It looks like you have defined it in the test case teardown instead of the test suite teardown. You can change it to use the Test teardown instead.
Edit: Here are two solutions:
1. Change your keyword to the TEST specific one, Run Keyword If Test Failed which applies to the last executed test, and can only be used in a test teardown.
2. The second is to use Suite Setups / teardowns. These apply to ALL test cases that you run. Like this:
***Settings***
Suite Setup Your Test Setup Keyword
Suite Teardown run keyword if any tests failed KeyFail
***Keywords***
Generation
(Some stuff)
KeyFail
log to console Error report being sent.
***Test Cases***
Requires successful generation of file
Generation
Teardown Case
Stuff to do
# teardown is automatic, and does not need to be called.

Related

Resource cleanup after each test

I'm using robot framework to test a REST API and as such I do have to create many temporary resources (test user or any other resource). Those are abstracted in keyword, but I need to clean them up after each test. But I would like to not worry about cleaning that explicitly in each test since it would require our test case to "play" at different levels of abstraction.
What would be great would be to have the keyword teardown running after the testcase is completed instead of directly after the keyword is completed.
I did some research but haven't found a good way to handle that.
Is there any solution to clean up resources created in a keyword at the end of a test case without doing it explicitly in the test case?
here is a code example to illustrate the situation:
helper.robot
*** Keywords ***
a user exists
create a user
Delete user
actually remove the user
test.robot
Resource helper.robot
*** Test Cases ***
test user can login
Given a user exists
When user login
Then it succeeds
[Teardown] Delete user
What I want is to move the teardown out of the test case to some other way that deletes the user after each test case, but without specifying if in each test case. I don’t want to configure that exact teardown at the setting level since we don’t always use the same resource for all test cases.
https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-setup-and-teardown
At the time of writing, the only special tags are robot:exit, that is
automatically added to tests when stopping test execution gracefully,
and robot:no-dry-run, that can be used to disable the dry run mode.
More usages are likely to be added in the future.
2.2.6 Test setup and teardown
Robot Framework has similar test setup and teardown functionality as
many other test automation frameworks. In short, a test setup is
something that is executed before a test case, and a test teardown is
executed after a test case. In Robot Framework setups and teardowns
are just normal keywords with possible arguments.
Setup and teardown are always a single keyword. If they need to take
care of multiple separate tasks, it is possible to create higher-level
user keywords for that purpose. An alternative solution is executing
multiple keywords using the BuiltIn keyword Run Keywords.
The test teardown is special in two ways. First of all, it is executed
also when a test case fails, so it can be used for clean-up activities
that must be done regardless of the test case status. In addition, all
the keywords in the teardown are also executed even if one of them
fails. This continue on failure functionality can be used also with
normal keywords, but inside teardowns it is on by default.
The easiest way to specify a setup or a teardown for test cases in a
test case file is using the Test Setup and Test Teardown settings in
the Setting table. Individual test cases can also have their own setup
or teardown. They are defined with the [Setup] or [Teardown] settings
in the test case table and they override possible Test Setup and Test
Teardown settings. Having no keyword after a [Setup] or [Teardown]
setting means having no setup or teardown. It is also possible to use
value NONE to indicate that a test has no setup/teardown.
*** Settings ***
Test Setup Open Application App A
Test Teardown Close Application
*** Test Cases ***
Default values
[Documentation] Setup and teardown from setting table
Do Something
Overridden setup
[Documentation] Own setup, teardown from setting table
[Setup] Open Application App B
Do Something
No teardown
[Documentation] Default setup, no teardown at all
Do Something
[Teardown]
No teardown 2
[Documentation] Setup and teardown can be disabled also with special value NONE
Do Something
[Teardown] NONE
Using variables
[Documentation] Setup and teardown specified using variables
[Setup] ${SETUP}
Do Something
[Teardown] ${TEARDOWN}
if you provide it in settings , it works as you want you don't have to specify for each test case

robot framework stop teardown execution in failure

I'm using robot framework to test my application
I use teardown in my test.
It works as expected, if my test ends or fails, teardown starts the execution. My problem starts when the teardown execution fails, then I want it to stop.
*** Test Cases ***
Test new data import
Setup test case
Run test case
[Teardown] TearDown test case
Teardown test case
Insert name in filter
Delete user
The scenarios is when "Insert name in filter" fails, I want it to stop running, but it executes the "Delete user" keyword.
Is it possible to prevent?
I finally do some research and see why the use of --exitonfailure (suggested in other answer) didn't work for me,it's because it misses the teardown workflow.
https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#id689 that teardown execution can be stopped
Teardown -> Also they are executed fully even if some of their keywords fail.
So, what I did to solve was use Run Keyword and return Status and Run Keyword if to solve:
*** Test Cases ***
Test new data import
Setup test case
Run test case
[Teardown] TearDown test case
Teardown test case
${filterStatus} Run keyword and return status Insert name in filter
Run keyword if ${filterStatus} Delete user
... ELSE fail Filter filter by name failed
Try this to prevent to executing "Delete user" keyword when calling exitonfailure: http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#stopping-when-first-test-case-fails
Usage: When options are used, they must always be given between the runner script and the data sources
--exitonfailure -x
Example: robot --exitonfailure 01_robot_test.robot
If option --exitonfailure (-X) is used, test execution stops immediately if any critical test fails. The remaining tests are marked as failed without actually executing them.

PASS and Log HTML Message after succeessful execution of test case

When a test case in Robotframework FAILs I am able to log "Test Message" in report with FAIL keyword:
FAIL *HTML* Log Link : Data
But how can I log the same on case of test PASS case criteria, I am not sure but should we use "Pass Execution" keyword - it states - Skips rest of the current test, setup, or teardown with PASS status - but I have teardown steps - so should we make use of Pass Execution keyword in test case body.
Log to Console logs only to standard output and is not captured in "Message" report.html while FAIL msg gets displayed in "Message"
Please let me know how to use PASS with message with just stating that the test cases was success and complete its teardown
I am not sure but should we use "Pass Execution" keyword - it states - Skips rest of the current test, setup, or teardown with PASS status - but I have teardown steps - so should we make use of Pass Execution keyword in the test case body.
If you use Pass Execution in the body of a test case, your teardown steps will still run. The documentation is trying to point out that if you use Pass Execution inside a teardown, the teardown will stop at the point that you call the keyword.
You can see this with a very simple example. Even though the following test calls Pass execution, both the suite teardown and test teardown will add messages to the log.
*** Settings ***
Suite Teardown log the suite teardown was called
*** Test Cases ***
Example
[Teardown] log the test teardown was called
Should be equal test test
Pass execution Looking good Bill Ray!
If you want to explicitly set the test message, you can use the built-in keyword
Set test message. It will change the test message for a passing test.
*** Test cases ***
Example
Should be equal test test
Set test message Looking good Billy Ray!

How to stop Robot Framework test execution if first testcase FAIL?

As shown in below robot file, I have three testcases. I want to stop the test execution, if TESTCASE1 fails. TESTCASE2 should be executed only if TESTCASE1 passes.
*** Settings ***
Library pythonLib
*** Test cases ***
TESTCASE1
boot device
TESTCASE2
configure device
TESTCASE3
restart device
Is there any keyword or custom way to do this ?
There is a command line option for this, if you want the behavior that robot should stop running as soon as any test fails. This option is --exitonfailure. From the robot framework user guide, in a section titled Stopping when the first test fails:
If option --exitonfailure is used, test execution stops immediately if
any critical test fails. Also the remaining tests are marked as
failed.
You might also want to take a look at this answer to the question Automatic failing/non-execution of interdependent tests in Robot Framework, which shows how to write a keyword to implement dependencies between test cases.
There are multiple ways to get the job done, each appropriate for different situations.
--exitonfailure
The command line option --exitonfailure aborts the test run after any testcase fails, unless it is marked noncritical.
Fatal Error
You might only want to abort if exactly TESTCASE1 fails. The Fatal Error keyword exist just for this purpose:
TESTCASE1
${passed}= Run Keyword And Return Status boot device
Run Keyword If not ${passed} Fatal Error
If this seems clunky to you, you can throw fatal errors directly from Python/Java.
Suite Setup
These tools will get the job done, and are appropriate in some cases. Although in the asker's case, I observe:
The first testcase must pass for any other tests to run.
It runs a keyword called boot device.
To me that is not a testcase. That is a setup. If you need a setup to run once before a suite of testcases, you should specify it as a Suite Setup.
***Settings***
Suite Setup boot device
--pause_on_failure, this will stop the execution, whenever script hit the error. Script execution won't be resumed unless you explicitly start.

Taking screenshot in robot framework on step (keyword) failure

I am testing a GUI application with robot framework and AutoItLibrary. I would like the test to take screenshot after any failure in test, but not in the test teardown, but right after the error occurs, as the steps in between the failure and the teardown usually make the screen worth nothing. Is there a way to do that in robot? All I could get so far is a screenshot in the end of a test...
Thanks in advance!
AutoIt lib has CaptureScreenOnError (defaults to False) argument so when importing the lib, set it to True. See https://robotframework-autoitlibrary.googlecode.com/svn/tags/robotframework-AutoItLibrary-1.1/doc/AutoItLibrary.html
It will not take screenshot if the error happens in non-AutoIt lib keyword. AFAIK there isn't any nice and sure way to take screenshot after any failure.
Run Keyword If Test Failed Take Screenshot
in every test teardown will handle most situation, but if the error happens in a keyword that has a teardown, the keyword teardown will be done before the test teardown. And "Run Keyword If Test Failed" will only work in test teardown.

Resources