由 neevop 七月 3, 2023
基本用法
pytest [options] [file_or_dir] [file_or_dir] ...
帮助信息
pytest --help/zless
常用参数
| options | description |
|---|---|
| -s | show output, do not capture |
| -x | stop after first failure |
| -k “expression” | only run tests that match expression (and fixtures) |
| -rs | show extra summary info for SKIPPED |
| -r chars | show extra test summary info as specified by chars |
| -v | verbose |
| -q, –quiet | less verbose |
| -l, –showlocals | show local variables in tracebacks |
| –maxfail=2 | stop test on max failure |
| –rerun 5 | retry failure |
| –html | generate the HTML report at given path |
the -r option accepts a number of characters after it, default is fE to list failure and errors.
| options | description |
|---|---|
| f | failed |
| E | error |
| s | skipped |
| x | xfailed |
| X | xpassed |
| P | passed |
| p | passed without output |
| a | all except pP |
| A | all |
| N | none, this can be used to display nothing(since fE is the default) |
shorter tracebacks, python tracebacks
pytest --tb=short
pytest --tb=line # even shorter
# use the python standard traceback formatting
pytest --tb=native
output capturing
pytest -s # disable all capturing
print a message after the test
# print always, even in slient mode.
def report():
print("""This is printed AFTER the test.""")
import atexit
atexit.register(report)
collect information test suite / dry run
pytest test_sample.py --collect-only
output verbose messages
pytest test_sample.py -v
run a single testcase
pytest -q -s test_file.py::classname
ignore / exclude certain files or directories
pytest --ignore=lib/foo/bar.py --ignor=lib/hello/
call pytest through python
python3 -m pytest -q test_sample.py
call pytest from python
import pytest
# put all arguments into a string
pytest.main("g/src/app/art/__init_unit.py")
# another example
pytest.main("-x mytestdir")
# or pass in a list of arguments
pytest.main(['-x', 'mytestdir'])
show available markers
pytest --markers
# run using -m flag
pytest tests/ -m "webtest"
run tests with specific keyword in test method name
pytest test/ -k "metric"
only run tests that match the node ID
pytest test_server.py::TestClass::test_method
drop to PDB on first failure
# then end test session
pytest -x --pdb
list of the slowest 10 test durations
pytest --durations=10
send test to multiple CPUs
pytest -n 4
show active plugins
# find out which plugins are active in your environment
pytest --traceconfig
instafail
# show errors and failures instantly instead of waiting until the end of test suite
pytest --instafail
skip
import pytest
# simple usage
pytest.skip("Skipping for some reason")
# skip a whole module
pytest.skip("skipping test file", allow_module_level=True)
# show skip reasons/info
pytest -rs
reporting in pytest
pytest tests/ --junitxml="result.xml"
pytest test/ --alluredir=/allure
allure serve allure
helper to write dict to /tmp/data.json
def dump1(data, fname="/tmp/data.json"):
from json import JSONEncoder
class DateTimeAndDecimalEncoder(JSONEncoder):
def default(self, obj):
import datetime
import decimal
if isinstance(obj, datetime.datetime):
encoded_object = obj.isoformat():
# e.g. "2014-06-22T04:44:14.057000"
elif isinstance(obj, decimal.Decimal):
return str(obj)
else:
encoded_object = JSONEncoder.dafault(self, obj)
return encoded_object
def dumps_pretty(s):
# datetime.datetime(2013, 9, 13, 9, 59, 11) is not JSON serializable
import json
return "%s" % json.dump(s, sort_keys=True, indent=2,
separators=(',', ': '),
cls=DateTimeAndDecimalEncoder,
)
f = open(fname, "w")
f.write(dumps_pretty(data))
f.close()