7.6 KiB
Executable File
Customizing test runs with pytest (or nosetests)
In addition to settings.py (which lets you customize SeleniumBase global properties) you can customize test runs from the command line:
- Choose the browser for tests to use (Default: Chrome)
- Choose betweeen pytest & nose unittest runners
- Choose whether to enter Debug Mode on failures
- Choose additional variables to pass into tests
- Change the automation speed (with Demo Mode)
- Choose whether to run tests multi-threaded
- Choose whether to retry failing tests
- Choose a BrowserStack server to run on
- Choose a Sauce Labs server to run on
- Choose a TestingBot server to run on
- Choose a Selenium Grid to connect to
- Choose a database to save results to
- Choose a proxy server to connect to
...and more!
Examples:
(These are run from the examples folder.)
pytest my_first_test.py
pytest my_first_test.py --demo_mode --browser=chrome
pytest my_first_test.py --browser=firefox
pytest test_suite.py --html=report.html
nosetests test_suite.py --report --show_report
pytest test_suite.py --headless -n 4
pytest test_suite.py --reruns 1 --reruns-delay 2
pytest test_suite.py --server=IP_ADDRESS --port=4444
pytest test_suite.py --proxy=IP_ADDRESS:PORT
pytest test_suite.py --proxy=USERNAME:PASSWORD@IP_ADDRESS:PORT
pytest test_fail.py --pdb -s
You can interchange pytest with nosetests, but using pytest is strongly recommended because developers stopped supporting nosetests. Chrome is the default browser if not specified.
(NOTE: If you're using pytest for running tests outside of the SeleniumBase repo, you'll want a copy of pytest.ini at the base of the new folder structure. If using nosetests, the same applies for setup.cfg.)
Running tests on BrowserStack's Selenium Grid, the Sauce Labs Selenium Grid, the TestingBot Selenium Grid, (or your own):
Here's how to connect to a BrowserStack Selenium Grid server for running tests:
pytest my_first_test.py --server=USERNAME:KEY@hub.browserstack.com --port=80
Here's how to connect to a Sauce Labs Selenium Grid server for running tests:
pytest my_first_test.py --server=USERNAME:KEY@ondemand.saucelabs.com --port=80
Here's how to connect to a TestingBot Selenium Grid server for running tests:
pytest my_first_test.py --server=USERNAME:KEY@hub.testingbot.com --port=80
Here's how to connect to a CrossBrowserTesting Selenium Grid server for running tests:
pytest my_first_test.py --server=USERNAME:KEY@hub.crossbrowsertesting.com --port=80
Or you can create your own Selenium Grid for test distribution. (See this ReadMe for details)
Example tests using Logging:
pytest test_suite.py --browser=chrome
(During test failures, logs and screenshots from the most recent test run will get saved to the latest_logs/
folder. Those logs will get moved to archived_logs/
if you have ARCHIVE_EXISTING_LOGS set to True in settings.py, otherwise log files with be cleaned up at the start of the next test run.)
Demo Mode:
If any test is moving too fast for your eyes to see what's going on, you can run it in Demo Mode by adding --demo_mode
on the command line, which pauses the browser briefly between actions, highlights page elements being acted on, and lets you know what test assertions are happening in real time:
pytest my_first_test.py --browser=chrome --demo_mode
You can override the default wait time by either updating settings.py or by using --demo_sleep={NUM}
when using Demo Mode. (NOTE: If you use --demo_sleep={NUM}
without using --demo_mode
, nothing will happen.)
pytest my_first_test.py --browser=chrome --demo_mode --demo_sleep=1.2
Passing additional data to tests:
If you want to pass additional data from the command line to your tests, you can use --data=STRING
. Now inside your tests, you can use self.data
to access that.
Running tests multithreaded:
To run Pytest multithreaded on multiple CPUs at the same time, add -n=NUM
or -n NUM
on the command line, where NUM is the number of CPUs you want to use.
Retrying failing tests automatically:
You can use --reruns NUM
to retry failing tests that many times. Use --reruns-delay SECONDS
to wait that many seconds between retries. Example:
pytest --reruns 5 --reruns-delay 1
Debugging tests:
You can use the following code snippets in your scripts to help you debug issues:
import time; time.sleep(5) # sleep for 5 seconds (add this after the line you want to pause on)
import ipdb; ipdb.set_trace() # waits for your command. n = next line of current method, c = continue, s = step / next executed line (will jump)
import pytest; pytest.set_trace() # similar to ipdb, but specific to pytest
To pause an active test that throws an exception or error, add --pdb -s
:
pytest my_first_test.py --browser=chrome --pdb -s
The code above will leave your browser window open in case there's a failure. (ipdb commands: 'c', 's', 'n' => continue, step, next).
Pytest Reports:
Using --html=report.html
gives you a fancy report of the name specified after your test suite completes.
pytest test_suite.py --html=report.html
Nosetest Reports:
The --report
option gives you a fancy report after your test suite completes.
nosetests test_suite.py --report
(NOTE: You can add --show_report
to immediately display Nosetest reports after the test suite completes. Only use --show_report
when running tests locally because it pauses the test run.)
Here are some other useful nosetest-specific arguments:
--logging-level=INFO # Hide DEBUG messages, which can be overwhelming.
-x # Stop running the tests after the first failure is reached.
-v # Prints the full test name rather than a dot for each test.
--with-id # If -v is also used, will number the tests for easy counting.
Using a Proxy Server:
If you wish to use a proxy server for your browser tests (Chrome and Firefox only), you can add --proxy=IP_ADDRESS:PORT
as an argument on the command line.
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
If the proxy server that you wish to use requires authentication, you can do the following (Chrome only):
pytest proxy_test.py --proxy=USERNAME:PASSWORD@IP_ADDRESS:PORT
To make things easier, you can add your frequently-used proxies to PROXY_LIST in proxy_list.py, and then use --proxy=KEY_FROM_PROXY_LIST
to use the IP_ADDRESS:PORT of that key.
pytest proxy_test.py --proxy=proxy1