Berjalan unittest dengan struktur direktori tes yang khas

700

Struktur direktori yang sangat umum bahkan untuk modul Python sederhana tampaknya memisahkan tes unit ke testdirektori mereka sendiri :

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

misalnya melihat proyek Python ini howto .

Pertanyaan saya sederhana. Apa cara biasa menjalankan tes? Saya menduga ini jelas untuk semua orang kecuali saya, tetapi Anda tidak bisa hanya menjalankan python test_antigravity.pydari direktori tes karena import antigravityakan gagal karena modul tidak ada di jalur.

Saya tahu saya bisa memodifikasi PYTHONPATH dan trik terkait jalur pencarian lainnya, tapi saya tidak percaya itu cara paling sederhana - tidak apa-apa jika Anda adalah pengembang tetapi tidak realistis untuk mengharapkan pengguna Anda untuk menggunakan jika mereka hanya ingin memeriksa tes lewat.

Alternatif lain adalah hanya menyalin file uji ke direktori lain, tetapi tampaknya agak bodoh dan melewatkan titik memiliki mereka di direktori terpisah untuk memulai.

Jadi, jika Anda baru saja mengunduh sumber ke proyek baru saya, bagaimana Anda menjalankan tes unit? Saya lebih suka jawaban yang akan membuat saya mengatakan kepada pengguna saya: "Untuk menjalankan tes unit lakukan X."

Mayor Mayor
sumber
5
@ EMP Solusi yang tepat ketika Anda perlu mengatur jalur pencarian adalah dengan ... mengatur jalur pencarian. Solusi macam apa yang Anda harapkan?
Carl Meyer
7
@CarlMeyer solusi lain yang lebih baik adalah dengan menggunakan unittestantarmuka baris perintah seperti yang dijelaskan dalam jawaban saya di bawah ini sehingga Anda tidak perlu menambahkan direktori ke jalan.
Pierre
13
Sama disini. Saya baru saja mulai menulis unit test pertama saya untuk proyek Python kecil dan mengambil beberapa hari mencoba untuk beralasan dengan fakta bahwa saya tidak dapat dengan mudah menjalankan tes sambil menyimpan sumber saya di direktori src dan tes di direktori tes, tampaknya dengan salah satu kerangka uji yang ada. Saya akhirnya akan menerima hal-hal, mencari cara; tetapi ini merupakan pengantar yang sangat menyebalkan. (Dan saya seorang veteran unit pengujian di luar Python.)
Ates Goral

Jawaban:

656

Solusi terbaik menurut saya adalah dengan menggunakan unittest antarmuka baris perintah yang akan menambahkan direktori ke sys.pathsehingga Anda tidak perlu (dilakukan di TestLoaderkelas).

Misalnya untuk struktur direktori seperti ini:

new_project
├── antigravity.py
└── test_antigravity.py

Anda bisa menjalankan:

$ cd new_project
$ python -m unittest test_antigravity

Untuk struktur direktori seperti milik Anda:

new_project
├── antigravity
   ├── __init__.py         # make it a package
   └── antigravity.py
└── test
    ├── __init__.py         # also make test a package
    └── test_antigravity.py

Dan dalam modul tes di dalam testpaket, Anda dapat mengimpor antigravitypaket dan modul-modulnya seperti biasa:

# import the package
import antigravity

# import the antigravity module
from antigravity import antigravity

# or an object inside the antigravity module
from antigravity.antigravity import my_object

Menjalankan modul uji tunggal:

Untuk menjalankan modul uji tunggal, dalam hal ini test_antigravity.py:

$ cd new_project
$ python -m unittest test.test_antigravity

Referensi saja modul tes dengan cara yang sama Anda mengimpornya.

Menjalankan uji kasus tunggal atau metode uji:

Anda juga dapat menjalankan TestCasemetode pengujian tunggal atau tunggal:

$ python -m unittest test.test_antigravity.GravityTestCase
$ python -m unittest test.test_antigravity.GravityTestCase.test_method

Menjalankan semua tes:

Anda juga dapat menggunakan penemuan tes yang akan menemukan dan menjalankan semua tes untuk Anda, mereka harus modul atau paket bernama test*.py(dapat diubah dengan -p, --patternbendera):

$ cd new_project
$ python -m unittest discover
$ # Also works without discover for Python 3
$ # as suggested by @Burrito in the comments
$ python -m unittest

Ini akan menjalankan semua test*.pymodul di dalam testpaket.

Pierre
sumber
53
python -m unittest discoverakan menemukan dan menjalankan tes di testdirektori jika diberi nama test*.py. Jika Anda menamai subdirektori tests, gunakan python -m unittest discover -s tests, dan jika Anda menamai file uji antigravity_test.py, gunakan python -m unittest discover -s tests -p '*test.py' Nama file dapat menggunakan garis bawah tetapi tidak garis putus-putus.
Mike3d0g
10
Ini gagal bagi saya di Python 3 dengan kesalahan ImportError: No module named 'test.test_antigravity'karena konflik dengan sub-modul tes dari perpustakaan yang belum dikirim. Mungkin seorang ahli dapat mengkonfirmasi dan mengubah jawaban nama sub-direktori menjadi misalnya, 'tes' (jamak).
expz
9
Saya test_antigravity.pymasih melempar kesalahan impor untuk keduanya import antigravitydan from antigravity import antigravityjuga. Saya memiliki kedua __init_.pyfile dan saya menelepon python3 -m unittest discoverdari new projectdirektori. Apa lagi yang bisa salah?
imrek
19
file test/__init__.pysangat penting di sini, bahkan jika kosong
Francois
3
@ Mike3d0g tidak yakin apakah Anda bermaksud menyiratkan bahwa nama direktori testitu spesial ... tetapi hanya sebagai catatan, tidak. : P python -m unittest discoverbekerja dengan file uji tests/juga test/.
ryan
49

Solusi paling sederhana untuk pengguna Anda adalah menyediakan skrip yang dapat dieksekusi ( runtests.pyatau semacamnya) yang mem-bootstrap lingkungan pengujian yang diperlukan, termasuk, jika perlu, menambahkan direktori proyek root Anda untuk sys.pathsementara. Ini tidak mengharuskan pengguna untuk mengatur variabel lingkungan, sesuatu seperti ini berfungsi dengan baik dalam skrip bootstrap:

import sys, os

sys.path.insert(0, os.path.dirname(__file__))

Maka instruksi Anda kepada pengguna Anda dapat sesederhana " python runtests.py".

Tentu saja, jika jalur yang Anda butuhkan benar-benar ada os.path.dirname(__file__), maka Anda tidak perlu menambahkannya sys.pathsama sekali; Python selalu menempatkan direktori skrip yang saat ini berjalan di awal sys.path, jadi tergantung pada struktur direktori Anda, hanya menempatkan Anda runtests.pydi tempat yang tepat mungkin semua yang diperlukan.

Juga, modul unittest di Python 2.7+ (yang di-backport sebagai unittest2 untuk Python 2.6 dan yang lebih lama) sekarang memiliki built-in penemuan tes , jadi hidung tidak lagi diperlukan jika Anda ingin penemuan tes otomatis: instruksi pengguna Anda dapat sesederhana python -m unittest discover.

Carl Meyer
sumber
Saya memasukkan beberapa tes ke dalam subfolder seperti "Major Major". Mereka dapat berjalan dengan python -m unittest find tetapi bagaimana saya dapat memilih untuk menjalankan hanya satu dari mereka. Jika saya menjalankan python -m unittest tests / testxxxxx maka gagal untuk masalah jalur. Karena mode dicovery menyelesaikan semua yang saya harapkan ada trik lain untuk menyelesaikan masalah lintasan tanpa perbaikan lintasan handcoding yang Anda sarankan di poin pertama
Frederic Bazin
2
@FredericBazin Jangan gunakan penemuan jika Anda hanya ingin satu tes atau file uji, cukup beri nama modul yang ingin Anda jalankan. Jika Anda menamakannya sebagai lintasan bertitik modul (bukan lintasan file), ia dapat mengetahui lintasan pencarian dengan benar. Lihat jawaban Peter untuk lebih jelasnya.
Carl Meyer
Peretasan ini berguna dalam skenario di mana saya harus menjalankan sesuatu python -m pdb tests\test_antigravity.py. Di dalam pdb, saya mengeksekusi sys.path.insert(0, "antigravity")yang memungkinkan pernyataan impor untuk diselesaikan seolah-olah saya menjalankan modul.
ixe013
23

Saya biasanya membuat skrip "jalankan pengujian" di direktori proyek (yang umum untuk direktori sumber dan test) yang memuat suite "Semua Tes" saya. Ini biasanya kode boilerplate, jadi saya bisa menggunakannya kembali dari proyek ke proyek.

run_tests.py:

import unittest
import test.all_tests
testSuite = test.all_tests.create_test_suite()
text_runner = unittest.TextTestRunner().run(testSuite)

test / all_tests.py (dari Bagaimana cara menjalankan semua tes unit Python dalam direktori? )

import glob
import unittest

def create_test_suite():
    test_file_strings = glob.glob('test/test_*.py')
    module_strings = ['test.'+str[5:len(str)-3] for str in test_file_strings]
    suites = [unittest.defaultTestLoader.loadTestsFromName(name) \
              for name in module_strings]
    testSuite = unittest.TestSuite(suites)
    return testSuite

Dengan pengaturan ini, Anda memang bisa hanya include antigravitydi modul tes Anda. Kelemahannya adalah Anda akan memerlukan lebih banyak kode dukungan untuk menjalankan tes tertentu ... Saya hanya menjalankannya setiap waktu.

stw_dev
sumber
1
Saya juga ingin sebuah run testsskrip di direktori proyek dan menemukan banyak bersih cara untuk melakukannya. Sangat dianjurkan.
z33k
18

Dari artikel yang Anda tautkan ke:

Buat file test_modulename.py dan masukkan tes Anda yang belum dikirim. Karena modul tes berada di direktori terpisah dari kode Anda, Anda mungkin perlu menambahkan direktori induk modul Anda ke PYTHONPATH Anda untuk menjalankannya:

$ cd /path/to/googlemaps

$ export PYTHONPATH=$PYTHONPATH:/path/to/googlemaps/googlemaps

$ python test/test_googlemaps.py

Akhirnya, ada satu lagi kerangka pengujian unit populer untuk Python (itu yang penting!), Hidung. hidung membantu menyederhanakan dan memperluas kerangka kerja yang belum dibuat (misalnya, secara otomatis dapat menemukan kode pengujian Anda dan mengatur PYTHONPATH Anda untuk Anda), tetapi itu tidak termasuk dalam distribusi Python standar.

Mungkin Anda harus melihat hidung seperti yang disarankan?

Mark Byers
sumber
3
Ya ini bekerja (untuk saya), tapi saya benar-benar meminta instruksi paling sederhana yang dapat saya berikan kepada pengguna untuk modul saya agar mereka menjalankan tes. Memodifikasi jalan mungkin benar-benar tepat, tetapi saya mencari sesuatu yang lebih mudah.
Mayor Mayor
4
Jadi seperti apa jalur python Anda setelah Anda bekerja pada seratus proyek? Apakah saya seharusnya secara manual masuk dan membersihkan jalur saya? Jika demikian, ini adalah desain yang menjijikkan!
jeremyjjbrown
11

Saya memiliki masalah yang sama, dengan folder unit test terpisah. Dari saran yang disebutkan, saya menambahkan jalur sumber absolut ke sys.path.

Manfaat dari solusi berikut adalah, bahwa seseorang dapat menjalankan file test/test_yourmodule.pytanpa mengubah pada awalnya menjadi direktori uji:

import sys, os
testdir = os.path.dirname(__file__)
srcdir = '../antigravity'
sys.path.insert(0, os.path.abspath(os.path.join(testdir, srcdir)))

import antigravity
import unittest
andpei
sumber
9

jika Anda menjalankan "python setup.py develop" maka paket akan berada di jalur. Tetapi Anda mungkin tidak ingin melakukan itu karena Anda dapat menginfeksi instalasi python sistem Anda, itulah sebabnya alat seperti virtualenv dan buildout ada.

Tom Willis
sumber
7

Solusi / Contoh untuk modul unittest Python

Diberikan struktur proyek berikut:

ProjectName
 ├── project_name
 |    ├── models
 |    |    └── thing_1.py
 |    └── __main__.py
 └── test
      ├── models
      |    └── test_thing_1.py
      └── __main__.py

Anda dapat menjalankan proyek Anda dari direktori root dengan python project_name, yang memanggil ProjectName/project_name/__main__.py.


Untuk menjalankan tes Anda dengan python test, berjalan secara efektif ProjectName/test/__main__.py, Anda perlu melakukan hal berikut:

1) Ubah test/modelsdirektori Anda menjadi sebuah paket dengan menambahkan __init__.pyfile. Ini membuat kasus uji dalam sub direktori dapat diakses dari testdirektori induk .

# ProjectName/test/models/__init__.py

from .test_thing_1 import Thing1TestCase        

2) Ubah jalur sistem Anda test/__main__.pyuntuk memasukkan project_namedirektori.

# ProjectName/test/__main__.py

import sys
import unittest

sys.path.append('../project_name')

loader = unittest.TestLoader()
testSuite = loader.discover('test')
testRunner = unittest.TextTestRunner(verbosity=2)
testRunner.run(testSuite)

Sekarang Anda dapat mengimpor hal-hal dari project_nametes Anda dengan sukses .

# ProjectName/test/models/test_thing_1.py    

import unittest
from project_name.models import Thing1  # this doesn't work without 'sys.path.append' per step 2 above

class Thing1TestCase(unittest.TestCase):

    def test_thing_1_init(self):
        thing_id = 'ABC'
        thing1 = Thing1(thing_id)
        self.assertEqual(thing_id, thing.id)
Derek Soike
sumber
5

Gunakan setup.py developuntuk membuat direktori kerja Anda menjadi bagian dari lingkungan Python yang terinstal, kemudian jalankan tes.

Ned Batchelder
sumber
Ini membuat saya invalid command 'develop'dan opsi ini tidak disebutkan jika saya meminta setup.py --help-commands. Apakah perlu ada sesuatu dalam setup.pydirinya sendiri untuk ini berfungsi?
Mayor Mayor
Ini OK - masalahnya adalah saya hilang import setuptoolsdari saya setup.pyberkas. Tapi saya kira itu tidak menunjukkan bahwa ini tidak akan berfungsi setiap saat untuk modul orang lain.
Mayor Mayor
1
Jika Anda memiliki pip , Anda dapat menggunakannya untuk menginstal paket Anda dalam mode "yang dapat diedit" : pip install -e .Ini juga menambahkan paket ke lingkungan Python tanpa menyalin sumbernya, memungkinkan Anda untuk terus mengeditnya di tempatnya.
Eric Smith
pip install -e .adalah hal yang sama persis python setup.py develop, hanya monkeypatches Anda setup.pyuntuk menggunakan setuptools bahkan jika itu tidak benar-benar, jadi itu berfungsi baik.
Carl Meyer
5

Jika Anda menggunakan Kode VS dan tes Anda berada pada tingkat yang sama dengan proyek Anda maka menjalankan dan men-debug kode Anda tidak akan berhasil. Apa yang dapat Anda lakukan adalah mengubah file launch.json Anda:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python",
            "type": "python",
            "request": "launch",
            "stopOnEntry": false,
            "pythonPath": "${config:python.pythonPath}",
            "program": "${file}",
            "cwd": "${workspaceRoot}",
            "env": {},
            "envFile": "${workspaceRoot}/.env",
            "debugOptions": [
                "WaitOnAbnormalExit",
                "WaitOnNormalExit",
                "RedirectOutput"
            ]
        }    
    ]
}

Kuncinya di sini adalah envFile

"envFile": "${workspaceRoot}/.env",

Di root proyek Anda, tambahkan file .env

Di dalam file .env Anda tambahkan jalur ke root proyek Anda. Ini sementara akan ditambahkan

PYTHONPATH = C: \ YOUR \ PYTHON \ PROJECT \ ROOT_DIRECTORY

jalur ke proyek Anda dan Anda akan dapat menggunakan tes unit debug dari VS Code

Vlad Bezden
sumber
5

Saya perhatikan bahwa jika Anda menjalankan antarmuka baris perintah yang paling bebas dari direktori "src" Anda, maka impor berfungsi dengan benar tanpa modifikasi.

python -m unittest discover -s ../test

Jika Anda ingin meletakkannya dalam file batch di direktori proyek Anda, Anda bisa melakukan ini:

setlocal & cd src & python -m unittest discover -s ../test
Alan L
sumber
5

Saya memiliki masalah yang sama untuk waktu yang lama. Apa yang baru-baru ini saya pilih adalah struktur direktori berikut:

project_path
├── Makefile
├── src
   ├── script_1.py
   ├── script_2.py
   └── script_3.py
└── tests
    ├── __init__.py
    ├── test_script_1.py
    ├── test_script_2.py
    └── test_script_3.py

dan dalam __init__.pyskrip folder tes, saya menulis yang berikut ini:

import os
import sys
PROJECT_PATH = os.getcwd()
SOURCE_PATH = os.path.join(
    PROJECT_PATH,"src"
)
sys.path.append(SOURCE_PATH)

Super penting untuk berbagi proyek adalah Makefile, karena itu memaksa menjalankan skrip dengan benar. Ini adalah perintah yang saya masukkan ke Makefile:

run_tests:
    python -m unittest discover .

Makefile penting bukan hanya karena perintah itu berjalan tetapi juga karena dari mana ia menjalankannya . Jika Anda akan melakukan cd dalam tes dan melakukannya python -m unittest discover ., itu tidak akan berhasil karena skrip init di unit_tests memanggil os.getcwd (), yang kemudian akan menunjuk ke jalur absolut yang salah (yang akan ditambahkan ke sys.path dan Anda akan hilang folder sumber Anda). Script akan berjalan karena temukan menemukan semua tes, tetapi mereka tidak akan berjalan dengan baik. Jadi Makefile ada di sana untuk menghindari harus mengingat masalah ini.

Saya sangat suka pendekatan ini karena saya tidak harus menyentuh folder src saya, unit test saya atau variabel lingkungan saya dan semuanya berjalan dengan lancar.

Beritahu saya jika kalian menyukainya.

Semoga itu bisa membantu,

Patrick Da Silva
sumber
4

Berikut ini adalah struktur proyek saya:

ProjectFolder:
 - project:
     - __init__.py
     - item.py
 - tests:
     - test_item.py

Saya merasa lebih baik mengimpor metode setUp ():

import unittest
import sys    

class ItemTest(unittest.TestCase):

    def setUp(self):
        sys.path.insert(0, "../project")
        from project import item
        # further setup using this import

    def test_item_props(self):
        # do my assertions

if __name__ == "__main__":
    unittest.main()
rolika
sumber
4

Apa cara yang biasa untuk benar-benar menjalankan tes

Saya menggunakan Python 3.6.2

cd new_project

pytest test/test_antigravity.py

Untuk menginstal pytest :sudo pip install pytest

Saya tidak menetapkan variabel jalur apa pun dan impor saya tidak gagal dengan struktur proyek "pengujian" yang sama.

Saya berkomentar tentang hal ini: if __name__ == '__main__'seperti ini:

test_antigravity.py

import antigravity

class TestAntigravity(unittest.TestCase):

    def test_something(self):

        # ... test stuff here


# if __name__ == '__main__':
# 
#     if __package__ is None:
# 
#         import something
#         sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
#         from .. import antigravity
# 
#     else:
# 
#         from .. import antigravity
# 
#     unittest.main()
Aliopi
sumber
4

Dimungkinkan untuk menggunakan pembungkus yang menjalankan tes terpilih atau semua.

Contohnya:

./run_tests antigravity/*.py

atau untuk menjalankan semua tes secara rekursif gunakan globbing ( tests/**/*.py) (aktifkan oleh shopt -s globstar).

Wrapper pada dasarnya dapat digunakan argparseuntuk mengurai argumen seperti:

parser = argparse.ArgumentParser()
parser.add_argument('files', nargs='*')

Kemudian muat semua tes:

for filename in args.files:
    exec(open(filename).read())

kemudian tambahkan ke dalam test suite Anda (menggunakan inspect):

alltests = unittest.TestSuite()
for name, obj in inspect.getmembers(sys.modules[__name__]):
    if inspect.isclass(obj) and name.startswith("FooTest"):
        alltests.addTest(unittest.makeSuite(obj))

dan jalankan:

result = unittest.TextTestRunner(verbosity=2).run(alltests)

Lihat contoh ini untuk detail lebih lanjut.

Lihat juga: Bagaimana menjalankan semua tes unit Python dalam direktori?

kenorb
sumber
4

Python 3+

Menambahkan ke @Pierre

Menggunakan unitteststruktur direktori seperti ini:

new_project
├── antigravity
   ├── __init__.py         # make it a package
   └── antigravity.py
└── test
    ├── __init__.py         # also make test a package
    └── test_antigravity.py

Untuk menjalankan modul tes test_antigravity.py:

$ cd new_project
$ python -m unittest test.test_antigravity

Atau satu TestCase

$ python -m unittest test.test_antigravity.GravityTestCase

Wajib jangan lupa __init__.pybahkan jika kosong tidak akan berfungsi.

eusoubrasileiro
sumber
2

Anda tidak dapat mengimpor dari direktori induk tanpa beberapa voodoo. Inilah cara lain yang bekerja dengan setidaknya Python 3.6.

Pertama, miliki file test / context.py dengan konten berikut:

import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

Kemudian impor berikut dalam file test / test_antigravity.py:

import unittest
try:
    import context
except ModuleNotFoundError:
    import test.context    
import antigravity

Perhatikan bahwa alasan untuk klausa coba-kecuali ini adalah itu

  • impor test.context gagal ketika dijalankan dengan "python test_antigravity.py" dan
  • konteks impor gagal ketika dijalankan dengan "python -m unittest" dari direktori new_project.

Dengan tipu daya ini mereka berdua bekerja.

Sekarang Anda dapat menjalankan semua file uji dalam direktori tes dengan:

$ pwd
/projects/new_project
$ python -m unittest

atau jalankan file tes individual dengan:

$ cd test
$ python test_antigravity

Oke, ini tidak jauh lebih cantik daripada memiliki konten context.py di dalam test_antigravity.py, tapi mungkin sedikit. Saran diterima.

tjk
sumber
2

Jika Anda memiliki banyak direktori di direktori pengujian Anda, maka Anda harus menambahkan __init__.pyfile ke setiap direktori .

/home/johndoe/snakeoil
└── test
    ├── __init__.py        
    └── frontend
        └── __init__.py
        └── test_foo.py
    └── backend
        └── __init__.py
        └── test_bar.py

Kemudian untuk menjalankan setiap tes sekaligus, jalankan:

python -m unittest discover -s /home/johndoe/snakeoil/test -t /home/johndoe/snakeoil

Sumber: python -m unittest -h

  -s START, --start-directory START
                        Directory to start discovery ('.' default)
  -t TOP, --top-level-directory TOP
                        Top level directory of project (defaults to start
                        directory)
Qlimax
sumber
1

Skrip BASH ini akan mengeksekusi direktori tes python unittest dari mana saja dalam sistem file, tidak peduli apa direktori yang Anda gunakan.

Ini berguna ketika tetap berada di direktori kerja ./srcatau ./exampledan Anda memerlukan tes unit cepat:

#!/bin/bash

this_program="$0"
dirname="`dirname $this_program`"
readlink="`readlink -e $dirname`"

python -m unittest discover -s "$readlink"/test -v

Tidak perlu test/__init__.pyfile membebani paket Anda / memori-overhead selama produksi.

John Greene
sumber
1

Dengan cara ini Anda dapat menjalankan skrip pengujian dari mana pun Anda inginkan tanpa mengacaukan variabel sistem dari baris perintah.

Ini menambahkan folder proyek utama ke jalur python, dengan lokasi ditemukan relatif terhadap skrip itu sendiri, bukan relatif terhadap direktori kerja saat ini.

import sys, os

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

Tambahkan itu ke atas semua skrip pengujian Anda. Itu akan menambahkan folder proyek utama ke jalur sistem, sehingga setiap modul impor yang berfungsi dari sana sekarang akan berfungsi. Dan tidak masalah dari mana Anda menjalankan tes.

Anda jelas dapat mengubah file project_path_hack agar sesuai dengan lokasi folder proyek utama Anda.

chasmani
sumber
0

Jika Anda mencari solusi khusus baris perintah:

Berdasarkan pada struktur direktori berikut (digeneralisasi dengan direktori sumber khusus):

new_project/
    src/
        antigravity.py
    test/
        test_antigravity.py

Windows : (dalam new_project)

$ set PYTHONPATH=%PYTHONPATH%;%cd%\src
$ python -m unittest discover -s test

Lihat pertanyaan ini jika Anda ingin menggunakan ini dalam batch untuk-loop.

Linux : (dalam new_project)

$ export PYTHONPATH=$PYTHONPATH:$(pwd)/src  [I think - please edit this answer if you are a Linux user and you know this]
$ python -m unittest discover -s test

Dengan pendekatan ini, juga dimungkinkan untuk menambahkan lebih banyak direktori ke PYTHONPATH jika perlu.

pj.dewitte
sumber
0

Anda harus benar-benar menggunakan alat pip.

Gunakan pip install -e .untuk menginstal paket Anda dalam mode pengembangan. Ini adalah praktik yang sangat baik, direkomendasikan oleh pytest (lihat dokumentasi praktik baik mereka , di mana Anda juga dapat menemukan dua tata letak proyek untuk diikuti).

cumi-cumi
sumber
Mengapa tidak memilih jawaban ini? Saya membaca jawaban yang diterima dan sementara itu tidak buruk, pytestadalah cara yang lebih baik untuk menjalankan tes, karena output konsol Anda dapatkan, dalam warna, dengan info jejak stack dan informasi kesalahan pernyataan rinci.
aliopi