I had rarely written ** "test code" ** until now, but I had the opportunity to write python test code and learned how to use it in a hurry. In this article, I've focused on how to use pytest, a framework for unit testing python.
Reference: Official documentation (https://docs.pytest.org/en/latest/contents.html)
A framework for unit testing in python. There is a similar one called unittest, but pytest seems to be more popular. The following are the features of pytest
--Detailed information when the test fails --Automatically discover modules and functions to be tested --By using the fixture function, you can pre-process tests such as mocking. (See below) --Compliant with unittest
pip install -U pytest
Basically, you can run the test as follows.
--Write the test case with ʻassert --Run
pytest`
If you enter the file name and method name in test_ *
, the test code will be found automatically (you can specify it yourself).
test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
Create the above test_sample.py file and
Run pytest
.
Then, the following test result is displayed.
========================================== test session starts ===========================================
platform darwin -- Python 3.7.6, pytest-5.4.3, py-1.8.1, pluggy-0.13.1
rootdir: /Users/xin/work/study/pytest
plugins: hypothesis-5.5.4, arraydiff-0.3, remotedata-0.3.2, openfiles-0.4.0, doctestplus-0.5.0, astropy-header-0.1.2
collected 1 item
test_sample.py F [100%]
================================================ FAILURES ================================================
______________________________________________ test_answer _______________________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:5: AssertionError
======================================== short test summary info =========================================
FAILED test_sample.py::test_answer - assert 4 == 5
=========================================== 1 failed in 0.18s ============================================
Exception testing is possible with pytest.raises
error_sample.py
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
By creating a class with Test
as a prefix, you can test the internal test methods at the same time.
test_class.py
class TestClass:
def test_one(self):
x = "this"
assert "h" in x
def test_two(self):
x = "hello"
assert hasattr(x, "check")
A tool provided to set up the test execution environment. I will pick up some useful ones. See below for details (https://docs.pytest.org/en/latest/fixture.html)
tmpdir
The tmpdir
fixture allows you to create a unique directory that is temporarily available during testing.
test_tempdir.py
import os
def test_create_file(tmpdir):
p = tmpdir.mkdir("sub").join("hello.txt") #Creating a temporary directory
p.write("content")
assert p.read() == "content"
assert len(tmpdir.listdir()) == 1
assert 0
monkeypatch
The monkeypatch
fixture allows you to mock an object.
For example, suppose you have the following product code, and one get_value ()
is a function that cannot be easily executed.
monkeypatch_product.py
def return_value(): #Product code
a = get_value()
return a
def get_value(): #Functions that cannot be easily executed
return 1
At this time, you can execute the test by replacing get_value ()
with your own mock function by using monkeypatch.setattr
.
monkeypatch_test.py
import monkeypatch_product
#Test code
def test_return_value(monkeypatch):
def mock_get_value():
return 100
#Replaced with mock function
monkeypatch.setattr(monkeypatch_product, "get_value", mock_get_value)
res = monkeypatch_product.return_value()
assert res == 100
You can also mock environment variables with monkeypatch.setenv
.
monkeypatch_env.py
import os
#Product code
def get_os_user_lower():
username = os.getenv("USER")
if username is None:
raise OSError("USER environment is not set.")
return username.lower()
#Test code
def test_get_os_user_lower(monkeypatch):
monkeypatch.setenv("USER", "TestingUser")
assert get_os_user_lower() == "testinguser"
Recommended Posts