61
votes

I have been trying to run unit tests using pytest in Python. I had written a module with one class and some methods inside that class. I wrote a unit test for this module (with a simple assert statement to check equality of lists) where I first instantiate the class with a list. Then I invoke a method on that object (from the class). Both test.py and the script to be tested are in the same folder. When I run pytest on it, I get "collected 0 items".

I am new to pytest, and but I am unable to run their examples successfully. What am I missing here?

I am running Python version 3.5.1 and pytest version 2.8.1 on Windows 7.

My test.py code:

from sort_algos import Sorts

def integer_sort_test():
    myobject1 = Sorts([-100, 10, -10])
    assert myobject1.merge_sort() == [-101, -100, 10]

sort_algos.py is a module containing class Sorts. merge_sort is a method under Sorts.

4
Please post a minimal reproducible example. What would you expect as a result if you place an empty .py file?Zulan
Random memory - something about .py being skipped if it's executable - see if it is and either change it to non-executable, or see if pytest has a include executable option?dwanderson
@ Zulan, added sample code to my postRamkumar Hariharan

4 Answers

103
votes

pytest gathers tests according to a naming convention. By default any file that is to contain tests must be named starting with test_, classes that hold tests must be named starting with Test, and any function in a file that should be treated as a test must also start with test_.

If you rename your test file to test_sorts.py and rename the example function you provide above as test_integer_sort, then you will find it is automatically collected and executed.

This test collecting behavior can be changed to suit your desires. Changing it will require learning about configuration in pytest.

9
votes

I had the same issue, but my function was called test.py. I never thought that the issue would be the file name.

In the documentation it says:

pytest will run all files of the form test_*.py or *_test.py in the current directory and its subdirectories. More generally, it follows standard test discovery rules.

Exactly! The name should be test_.py or test_something.py and works for me.

I feel so stupid, hehe.

1
votes

I faced this issue too and it took me a whole day to find out that the class name should start with "Test" my class name was "test" instead. That made me run my code successfully.

Make sure your python test file name and method name should also start with "test_"

0
votes

I ran into this problem as well. And it was not caused by script names, but due to a plugin called "pytest-appium" which I have no intention to use in the first place.

I finally found it out from report: ('c:\python39\lib\site-packages\pytest_appium\plugin.py', 8, 'Skipped: no variables file')

Since plugin.py requires variables which I have no idea what it is for.

@pytest.fixture(scope='session')
def appium(variables):
    if not variables:
        pytest.skip('no variables file')

Solution:

pip uninstall pytest-appium