==== tasks ==== * [[check if two lists are equal]] ==== test a function that writes output to a file ==== $ cat write_file.py def write_to_file(fname): with open(fname, 'w') as FileObj: FileObj.write('Hello\n') def test_write_to_file(tmpdir): file = tmpdir.join('output.txt') write_to_file(file) contents_got = file.read() contents_expected = 'Hello\n' assert contents_got == contents_expected $ python -m pytest write_file.py Ref: * https://docs.pytest.org/en/7.1.x/how-to/tmp_path.html * https://docs.pytest.org/en/6.2.x/tmpdir.html * https://stackoverflow.com/questions/20531072/writing-a-pytest-function-to-check-outputting-to-a-file-in-python ==== test a script that prints to stdout ==== tags | python test case for print snippet 1: def test_foo(capsys): ... captured = capsys.readouterr() ... assert captured.out == expected_output snippet 2: out, error = capsys.readouterr() Ref:- * See https://docs.pytest.org/en/stable/capture.html#accessing-captured-output-from-a-test-function for help on how capsys works in pytest. * https://stackoverflow.com/a/56300627/6305733 - contains a simple example; shows how to use capsys with pytest as well as with unittest; I first came across capsys here. * my usages: * https://github.com/KamarajuKusumanchi/rutils/blob/master/python3/tests/lib/test_DataFrameUtils.py - tests dataframe printed to stdout * https://github.com/KamarajuKusumanchi/rutils/blob/master/python3/tests/test_get_column_names.py - I used capsys for the first time here ==== run pytest on the current file from the current file ==== * https://stackoverflow.com/questions/35353771/invoke-pytest-from-python-for-current-module-only - gives the solution * https://docs.pytest.org/en/stable/usage.html#calling-pytest-from-python-code tags | run pytest from main function, pytest run parameterized test ==== assert actual expected template ==== template 1 assert Actual == Expected,\ 'Expected = {}, Actual = {}'.format(Expected, Actual) template 2 from pandas.util.testing import assert_frame_equal assert_frame_equal(df_actual, df_expected) template 3 import pytest @pytest.mark.parametrize('input, expected_output', [ ('foo', bar), ('foo2', bar2), ]) def test_fancy_func(input, expected_output): got = fancy_func(input) assert got == expected_output, 'Expected = {}, got = {}'.format(expected_output, got) ==== useful links ==== * https://docs.pytest.org/en/latest/getting-started.html - Get started on pytest * Source code - https://github.com/pytest-dev/pytest * Official documentation - https://docs.pytest.org * http://pythontesting.net - Brian Okken's website on pytest and code testing in general * To get it from PyPI - https://pypi.python.org/pypi/pytest * T. Ben Thompson's python testing set up - http://tbenthompson.com/post/how_i_test/ * https://docs.pytest.org/en/latest/how-to/assert.html#assertions-about-expected-exceptions - shows how to check whether the code is throwing exceptions or not. Links related to parameterization: * Parametrizing fixtures and test functions - https://docs.pytest.org/en/latest/parametrize.html#parametrize-basics * Parametrizing tests - https://docs.pytest.org/en/latest/example/parametrize.html * parametrizing tests where functions have default arguments - https://stackoverflow.com/questions/35844791/how-to-write-a-test-for-a-function-with-optional-arguments ==== books on pytest ==== * pytest Quick Start Guide by Bruno Oliveira, published by Packt - https://github.com/PacktPublishing/pytest-Quick-Start-Guide * Python Testing with pytest: Simple, Rapid, Effective, and Scalable 1st Edition by Brian Okken - https://www.amazon.com/Python-Testing-pytest-Effective-Scalable/dp/1680502409/ ==== who wrote pytest ==== * https://github.com/pytest-dev/pytest/blob/master/AUTHORS