# Model Tester¶

New in version 2.0.

pytest-qt includes a fixture that helps testing QAbstractItemModel implementations. The implementation is copied from the C++ code as described on the Qt Wiki, and it continuously checks a model as it changes, helping to verify the state and catching many common errors the moment they show up.

Some of the conditions caught include:

• Verifying X number of rows have been inserted in the correct place after the signal rowsAboutToBeInserted() says X rows will be inserted.
• The parent of the first index of the first row is a QModelIndex()
• Calling index() twice in a row with the same values will return the same QModelIndex
• If rowCount() says there are X number of rows, model test will verify that is true.
• Many possible off by one bugs
• hasChildren() returns true if rowCount() is greater then zero.
• and many more…

To use it, create an instance of your model implementation, fill it with some items and call qtmodeltester.check:

def test_standard_item_model(qtmodeltester):
model = QStandardItemModel()
items = [QStandardItem(str(i)) for i in range(4)]
model.setItem(0, 0, items[0])
model.setItem(0, 1, items[1])
model.setItem(1, 0, items[2])
model.setItem(1, 1, items[3])
qtmodeltester.check(model)


If the tester finds a problem the test will fail with an assert pinpointing the issue.

## Qt/Python tester¶

Starting with PyQt5 5.11, Qt’s QAbstractItemModelTester is exposed to Python.

If it’s available, by default, qtmodeltester.check will use the C++ implementation and fail tests if it emits any warnings.

To use the Python implementation instead, use qtmodeltester.check(model, force_py=True).

## Credits¶

The source code was ported from qabstractitemmodeltester.cpp by Florian Bruhin, many thanks!