Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pytest: how to make dedicated test directory

I want the following project structure:

|--folder/
|  |--tests/
|  |--project/

Let's write a simple example:

|--test_pytest/
|  |--tests/
|  |  |--test_sum.py
|  |--t_pytest/
|  |  |--sum.py
|  |  |--__init__.py

sum.py:

def my_sum(a, b):
    return a + b

test_sum.py:

from t_pytest.sum import my_sum
def test_my_sum():
    assert my_sum(2, 2) == 5, "math still works"

Let's run it:

test_pytest$ py.test ./
========== test session starts ===========
platform linux -- Python 3.4.3, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/step/test_pytest, inifile: 
collected 0 items / 1 errors 

================= ERRORS =================
___ ERROR collecting tests/test_sum.py ___
tests/test_sum.py:1: in <module>
    from t_pytest import my_sum
E   ImportError: No module named 't_pytest'
======== 1 error in 0.01 seconds =========

It can't see t_pytest module. It was made like httpie:

https://github.com/jkbrzt/httpie/

https://github.com/jkbrzt/httpie/blob/master/tests/test_errors.py

Why? How can I correct it?

like image 748
stepuncius Avatar asked Jun 14 '16 15:06

stepuncius


2 Answers

An alternative way is making tests a module as well, by adding __init__.py file in folder tests. One of the most popular python lib requests https://github.com/kennethreitz/requests is doing in this way in their unit tests folder tests. You don't have to export PYTHONPATH to your project to execute tests.

The limitation is you have to run py.test command in directory 'test_pytest' in your example project.

One more thing, the import line in your example code is wrong. It should be

from t_pytest.sum import my_sum
like image 81
Li Feng Avatar answered Sep 23 '22 09:09

Li Feng


Thank you, jonrsharpe. Py.test does no magic, I need to make my packages importable myself. There is one of possible solutions:

   $ export PYTHONPATH="${PYTHONPATH}: [Path to folder with my module]"   

( PYTHONPATH is one of path sources for sys.path )
If I need to make this change permanently, I need to add this string to ~/.bashrc

like image 23
stepuncius Avatar answered Sep 19 '22 09:09

stepuncius