Model Tester
Added 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 sameQModelIndex
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 ifrowCount()
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!