pytest: dealing with halting tests#

Besides using –durations option, which does not seem to show the interrupted halted tests, one possible way to deal with halting tests is to use pytest-timeout. However, it does not work with pytest-xdist, which a large issue when you are refactoring a large codebase with lots of tests and not ready to wait 5x times longer.

Fortunately, pytest is an excellent rich framework and provides a concept of hooks. And so to deal with this problem it is possible to use pytest_runtest_call hook to write to a file a time when a test started and when it ended. With this, it should be easy to figure out most of the halting tests in one go.

@pytest.hookimpl(hookwrapper=True, trylast=False)
def pytest_runtest_call(item):
   with open("run-stats.log", "a") as f:
      f.write(item.nodeid + " started " + datetime.now().isoformat() + "\n")
   yield
   with open("run-stats.log", "a") as f:
      f.write(item.nodeid + " ended " + datetime.now().isoformat() + "\n")

You can find more information on using hooks in official documentation - pytest.hookspec.pytest_runtest_protocol