As your Python model grows in complexity and size, you might need to implement automated testing in order to maintain its functionality. The Python package pytest provides a framework for reusing testing functions and objects as part of a test routine, which can help keep your testing logic organized and maintainable.
|
|
Note:
Pytest is backward-compatible with the
unittest package.
|
Before you set up automated testing, make sure you have the
pytest package installed.
To set up unit tests for Xpress Insight applications using pytest, follow these steps:
- In your project root directory, create a new test subdirectory.
This folder will be the location for unit tests. This folder will not be distributed when you deploy the app.
- In the test subdirectory, create a new Python test file.
The name of this file must start with the prefix
test_ (for example,
test_application.py).
- In the header of the new file, import the
pytest and xpressinsight packages:
import pytest
import xpressinsight as xi
- Make your Python modules visible to the test code.
Import the native
os and
sys packages and then append the
python_source directory to the list of directories the interpreter will search for modules:
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__),'..','python_source'))
from application import InsightApp
- Move the
__main__ function from your application Python file to the new test_application.py file and redefine it as a standard function.
The new function name must start with
test_, and it must accept a
tmp_path parameter, which specifies the name of a temporary directory that
pytest will create when the test runs. This temporary directory is unique to the test invocation and therefore does not conflict with the
Xpress Insight temporary working directory
work_dir. (You can set the value of this
tmp_path parameter using the
xpressinsight.create_app argument
app_work_dir.)
def test_app(tmp_path: pathlib.Path):
""" Unit testing """
app = xi.create_app(InsightApp, app_work_dir=str(tmp_path))
app.call_exec_mode('LOAD')
app.InputEntity = 0.2
app.data_connector.save_input()
app.call_exec_mode('RUN')
- At the end of the
test_ function, write an assert statement as a Boolean expression that tests whether some outcome matches the expectations for a given value or set of values.
This assertion must evaluate to
True for the test to be successful. For an equality assertion, you can wrap the expected value in the
pytest.approx() function to match a result value that lies within a relative tolerance (the default tolerance is
1e-6 (1 part in 1 million). For example, this assertion tests for an entity result value that is equal to
13.42, within the default tolerance:
assert app.ResultEntity == pytest.approx(13.42)
- Set the main function of the new test_application.py file to invoke
pytest.main() to run the tests directly from your IDE.
You can run
test_application.py with the new
test directory as the active working directory:
if __name__ == "__main__":
pytest.main()
Alternatively, you can run
pytest from the
test directory at a terminal prompt.
pytest automatically discovers all tests in files whose names start with
test_ and runs all functions that start with
test_. Use the
-v flag to show the result (
PASSED or
FAILED) from each test, and the
-s flag to show the run log for each test:
pytest -v -s
You can also run the tests in parallel by specifying the
-n flag:
pytest -n num
where
num is the number of parallel workers to use. If you are setting
app_work_dir as the
tmp_path, each new test runs in a separate subdirectory in your temporary working directory. The last 3 temporary subdirectories are kept, with older subdirectories deleted after each
pytest run.
© 2001-2025 Fair Isaac Corporation. All rights reserved. This documentation is the
property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not
convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except
solely for internal evaluation purposes to determine whether to purchase a license to the software
described in this documentation, or as otherwise set forth in a written software license agreement
between you and FICO (or a FICO affiliate). Use of this documentation and the software described in
it must conform strictly to the foregoing permitted uses, and no other use is permitted.