Initializing help system before first use

Setting Up Unit Tests Using the Pytest Framework

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:

  1. 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.
  2. 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).
  3. In the header of the new file, import the pytest and xpressinsight packages:
    import pytest
    import xpressinsight as xi
    
  4. 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
    
  5. 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')
    
  6. 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)
  7. 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.