pytest ไม่สามารถนำเข้าโมดูลในขณะที่ python สามารถทำได้


127

ฉันกำลังทำงานกับแพ็คเกจใน Python ฉันใช้ Virtualenv ฉันตั้งค่าพา ธ ไปยังรูทของโมดูลในพา ธ . pth ใน Virtualenv ของฉันเพื่อที่ฉันจะสามารถอิมพอร์ตโมดูลของแพ็กเกจในขณะที่พัฒนาโค้ดและทำการทดสอบ (คำถามที่ 1: เป็นวิธีที่ดีหรือไม่?) ใช้งานได้ดี (นี่คือตัวอย่างนี่คือพฤติกรรมที่ฉันต้องการ):

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py 
issued command: echo hello
command output: hello

อย่างไรก็ตามหากฉันพยายามใช้ PyTest ฉันได้รับข้อความแสดงข้อผิดพลาดในการนำเข้า:

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile: 
collected 0 items / 1 errors 

================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ns.py:2: in <module>
    from rc import ns
E   ImportError: cannot import name ns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================= 1 error in 0.09 seconds ==========================================
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest

ฉันงงเล็กน้อยดูเหมือนว่านี่บ่งบอกถึงข้อผิดพลาดในการนำเข้า แต่ Python ทำได้ดีเหตุใดจึงมีปัญหาเฉพาะกับ PyTest ข้อเสนอแนะเกี่ยวกับเหตุผล / วิธีแก้ไข (คำถามที่ 2) หรือไม่? ฉัน googled และซ้อนทับข้อผิดพลาด 'ImportError: ไม่สามารถนำเข้า' สำหรับ PyTest แต่ Hit ที่ฉันได้รับนั้นเกี่ยวข้องกับเส้นทาง python ที่หายไปและวิธีแก้ไขซึ่งดูเหมือนจะไม่ใช่ปัญหาที่นี่ ข้อเสนอแนะใด ๆ ?

คำตอบ:


127

พบคำตอบ:

อย่าวาง__init__.pyไฟล์ในโฟลเดอร์ที่มี TESTS หากคุณวางแผนที่จะใช้ pytest ฉันมีไฟล์ดังกล่าวหนึ่งไฟล์การลบมันช่วยแก้ปัญหาได้

สิ่งนี้ถูกฝังอยู่ในความคิดเห็นของคำตอบที่สองของปัญหา PATH ด้วย pytest 'ImportError: ไม่มีโมดูลชื่อ YadaYadaYada'ดังนั้นฉันจึงไม่เห็นมันหวังว่าจะได้รับการเปิดเผยที่นี่มากขึ้น


53
ตลก. ฉันมีปัญหาเดียวกันและฉันต้องเพิ่มinit .py ในโฟลเดอร์การทดสอบของฉัน
Ev.

7
ใช่นี้ไม่ได้เป็นวิธีการแก้ปัญหาทั่วไป (แม้ว่ามันจะเป็นในกรณีของคุณ) เพื่อให้เข้าใจว่าทำไมนี้ควรอ่าน: docs.pytest.org/en/latest/goodpractices.html#test-package-name

3
ข้อมูลนี้ไม่ถูกต้องและทำให้เข้าใจผิด! หลังจากเพิ่มinit .py ลงในโฟลเดอร์ทดสอบทุกอย่างทำงานได้ดี
Leonardo Ostan

1
@LeonardoOstan อาจผิดสำหรับคุณ แต่ไม่ได้หมายความว่าข้อมูลนี้ผิดโดยทั่วไป ในกรณีของฉันมันแก้ปัญหาได้
Desprit

89

ฉันไม่สามารถพูดฉันเข้าใจว่าทำไมงานนี้ python -m pytestแต่ฉันมีปัญหาเดียวกันและการทดสอบการทำงานของดีถ้าผมทำงาน

ฉันอยู่ใน Virtualenv และยังมี pytest ให้บริการทั่วโลก:

(proj)tom@neon ~/dev/proj$ type -a python
python is /home/tom/.virtualenvs/proj/bin/python
python is /usr/bin/python

(proj)tom@neon ~/dev/proj$ python -V
Python 3.5.2

(proj)tom@neon ~/dev/proj$ type -a pytest
pytest is /home/tom/.virtualenvs/proj/bin/pytest
pytest is /usr/bin/pytest

(proj)tom@neon ~/dev/proj$ pytest --version
This is pytest version 3.5.0, imported from /home/tom/.virtualenvs/proj/lib/python3.5/site-packages/pytest.py

1
งานสำหรับฉันเช่นกันสิ่งนี้คือมันถูกเรียกใช้โดยเวอร์ชัน python ที่กำหนดไว้แทน v.env ของคุณ
Nebulosar

14
สาเหตุหนึ่งอาจเป็นเพราะpython -m pytest [...]"จะเพิ่มไดเร็กทอรีปัจจุบันลงในsys.path"
ลบ

มีเหมือนกันใน Windows 10 และการเรียกใช้ python -m pytest แก้ไขได้
Duccio

สิ่งนี้ใช้ได้ผลเช่นกันในสภาพแวดล้อมเสมือนจริงของฉันที่ฉันต้องเรียกใช้python3 -m pytest
Rishi Raj

จากความคิดเห็นของ @minusf ฉันใช้PYTHONPATH=.:./src pytestเป็นเป้าหมาย
jan groth

32

ฉันเพิ่งแก้ไขสิ่งนี้โดยการลบ __init__.py ในรูทโปรเจ็กต์ของฉัน:

.
├── __init__.py <--- removed
├── models
│   ├── __init__.py
│   ├── address.py
│   ├── appointment.py
│   └── client.py
├── requirements.txt
├── setup.cfg
├── tests
│   ├── __init__.py
│   ├── models
│   │   ├── __init__.py
│   │   ├── appointment_test.py
│   │   └── client_test.py
│   └── other_test.py
└── script.py

4
คำตอบที่ยอมรับ__init__.py file in a folder containing TESTSไม่ได้ช่วยแก้ปัญหาของฉัน อันนี้ใช้ได้ ฉันเดาว่าเป็นเพราะลำดับชั้นของไฟล์
smido

ฉันลบ__init__.pyไฟล์แล้ว ฉันยังคงประสบปัญหา การเพิ่มไฟล์ conftest.py ลงในไดเร็กทอรีรูทใช้ได้ผลสำหรับฉัน
Vijay Sali

ฉันคาดหวังว่า conftest.py จะอยู่ใน / การทดสอบไม่ใช่รูท
Aaron McMillin

การรับไฟล์ conftest.py ไปยังไดเร็กทอรีรูทก็แก้ไขให้ฉันด้วย ไม่มีไฟล์init. py ในไดเรกทอรีการทดสอบ
อัปเดต

2
วิธีนี้ใช้ได้ผลสำหรับฉัน แต่มีใครรู้ไหมว่านี่จะทำให้เกิดข้อผิดพลาดในการนำเข้า
Aldo Okware

21

ฉันมีปัญหาเดียวกัน แต่ด้วยเหตุผลอื่นนอกเหนือจากที่กล่าวถึง:

ฉันติดตั้ง py.test ทั่วโลกในขณะที่ติดตั้งแพ็คเกจในสภาพแวดล้อมเสมือน

วิธีแก้ปัญหาคือการติดตั้งpytestในสภาพแวดล้อมเสมือน (ในกรณีที่เชลล์ของคุณแฮชไฟล์ปฏิบัติการอย่างที่ Bash ใช้hash -rหรือใช้เส้นทางแบบเต็มไปยังpy.test)


2
เพิ่งรู้ว่าฉันมีปัญหาส่อเสียดเหมือนกันโดยใช้อนาคอนดา ฉันลืมที่จะเพิ่มpytestใน Virtualenv ที่สร้างโดยcondaแต่pytestมันมีอยู่ในสภาพแวดล้อมรูทของ anaconda ดังนั้นจึงสามารถพบpytest แต่ไม่พบแพ็คเกจใด ๆ ที่ติดตั้งในสภาพแวดล้อม
Overdrivr

1
ฉันมีปัญหาเดียวกัน pytest ถูกติดตั้งทั่วโลกและไม่ได้อยู่ใน Virtualenv pip3 install pytestภายใน Virtualenv แก้ไขปัญหา
Ankit Singh

8

ปัญหานี้จะเกิดขึ้นถ้าคุณมีไฟล์และโฟลเดอร์ที่มีการทดสอบtests.pytests/__init__.py

ในระหว่างการรวบรวม pytest พบโฟลเดอร์ แต่เมื่อพยายามนำเข้าไฟล์ทดสอบจากโฟลเดอร์tests.pyไฟล์จะทำให้เกิดปัญหาในการนำเข้า

ในการแก้ไขเพียงแค่ลบtests.pyไฟล์และทำการทดสอบทั้งหมดของคุณในtests/โฟลเดอร์

สำหรับกรณีเฉพาะของคุณการแก้ไขจะเป็นไปอย่างแม่นยำ:

  • ลบไฟล์ /home/zz/Desktop/GitFolders/rc/tests.py
  • ตรวจสอบให้แน่ใจว่า/home/zz/Desktop/GitFolders/rc/tests/__init__.pyมีอยู่

5

ติดตั้งแพ็กเกจในสภาพแวดล้อมเสมือนของคุณ
จากนั้นเริ่มเชลล์ใหม่และซอร์สสภาพแวดล้อมเสมือนของคุณอีกครั้ง


1
นั่นคือปัญหาของฉัน: สดติดตั้งโดยไม่ต้องโหลด venv
แช่แข็ง

5

มีปัญหาที่คล้ายกันและใช้งานได้เมื่อฉันเพิ่ม__init__.pyไฟล์ภายใต้ไดเรกทอรีการทดสอบ


ไม่รู้ว่าทำไมถึงได้ผล แต่มันทำได้ !!! ขอบคุณมาก :)
Gooseman

4

ฉันมีปัญหาที่คล้ายกันข้อผิดพลาดเดียวกันทุกประการ แต่สาเหตุต่างกัน ฉันใช้รหัสทดสอบได้ดี แต่เทียบกับโมดูลเวอร์ชันเก่า ในเวอร์ชันก่อนหน้าของรหัสของฉันมีคลาสหนึ่งอยู่ในขณะที่อีกคลาสไม่มี หลังจากอัปเดตรหัสของฉันฉันควรเรียกใช้สิ่งต่อไปนี้เพื่อติดตั้ง

sudo pip install ./ --upgrade

เมื่อติดตั้งโมดูลที่อัปเดตที่รัน pytest ให้ผลลัพธ์ที่ถูกต้อง (เพราะฉันใช้ฐานรหัสที่ถูกต้อง)


1
สิ่งนี้ได้ผลสำหรับฉัน! โมดูลของฉันได้รับการติดตั้งในเวลาเดียวกันกับไลบรารีในคอนเทนเนอร์นักเทียบท่าที่ฉันใช้เพื่อเรียกใช้ pytest เมื่อเรียกใช้ python interpreter จะพบโค้ดที่อัปเดต แต่ pytest จะยังคงค้นหาโค้ดเหมือนเดิมเมื่อติดตั้งไลบรารีครั้งแรก การรันpip install ./ --upgradeอัปเดตเวอร์ชันที่ติดตั้งของ lib ด้วยรหัสล่าสุดและเปิดใช้งาน pytest เพื่อค้นหาเวอร์ชันล่าสุดนี้ด้วย
FaustoW

4

ในกรณีของฉันข้อผิดพลาดในการนำเข้าเกิดขึ้นเนื่องจากแพคเกจชี้ไปที่แพ็คเกจ / ไดเร็กทอรีอื่นที่มีชื่อเดียวกันและพา ธ อยู่เหนือโฟลเดอร์ที่ฉันต้องการจริงๆ ฉันคิดว่าสิ่งนี้ยังอธิบายได้ว่าทำไมบางคนถึงต้องลบ _ init _.py ในขณะที่บางคนต้องเพิ่มกลับ

ฉันใส่print(the_root_package.__path__)(หลังimport the_root_package) ทั้งในpythonคอนโซลและpytestสคริปต์เพื่อเปรียบเทียบความแตกต่าง

บรรทัดด้านล่าง: เมื่อคุณทำแพคเกจที่คุณนำเข้าอาจแตกต่างจากแพคเกจเมื่อคุณเรียกใช้pythonpytest


2

คำตอบข้างต้นไม่ได้ผลสำหรับฉัน ฉันเพิ่งแก้ไขโดยต่อท้ายพา ธ สัมบูรณ์ของโมดูลซึ่งไม่พบsys.pathที่ด้านบนของtest_xxx.py(โมดูลทดสอบของคุณ) เช่น:

import sys
sys.path.append('path')

2
แทนที่จะวางบรรทัดเหล่านี้ไว้ที่ด้านบนสุดของฉันtest_main.pyฉันใส่ไว้ในconftest.pyไดเร็กทอรีทดสอบของฉันและมันได้ผล ขอขอบคุณที่ให้โซลูชันแบบเป็นโปรแกรมแทนการใช้ไฟล์ทิ้งขยะ
Cameron Hudson

2

หากเกี่ยวข้องกับรหัส python ที่พัฒนาใน python 2.7 และตอนนี้ย้ายไปยัง python 3.x กว่าปัญหาอาจเกี่ยวข้องกับปัญหาการนำเข้า

เช่นเมื่อนำเข้าวัตถุจากไฟล์: baseที่อยู่ในไดเร็กทอรีเดียวกันสิ่งนี้จะใช้ได้ใน python 2.x:

from base import MyClass

ใน python 3.x คุณควรแทนที่ด้วยbaseเส้นทางแบบเต็มหรือ.base ไม่ทำเช่นนั้นจะทำให้เกิดปัญหาข้างต้น ลอง:

from .base import MyClass

2

วันนี้ฉันพบปัญหานี้และแก้ไขได้โดยเรียกpython -m pytestจากรากของไดเรกทอรีโครงการของฉัน

การโทรpytestจากสถานที่เดียวกันยังคงทำให้เกิดปัญหา

โครงการของฉันจัดเป็น:

api/
 - server/
  - tests/
      - test_routes.py
  - routes/
      - routes.py
 - app.py

โมดูลroutesถูกนำเข้าใน my test_routes.pyas:from server.routes.routes import Routes

หวังว่าจะช่วยได้!


ขอบคุณสำหรับการช่วยเตือนฉันเคยใช้เคล็ดลับในอดีตและอยู่ในเอกสาร pytest
Jason R Stevens CFA

2

เพียงใส่conftest.pyไฟล์ว่างในไดเร็กทอรีรูทของโปรเจ็กต์เพราะเมื่อpytestค้นพบ conftest.py มันจะปรับเปลี่ยน sys.path เพื่อให้สามารถนำเข้าสิ่งต่างๆจากconftestโมดูลได้ โครงสร้างไดเร็กทอรีทั่วไปสามารถ:

Root
├── conftest.py
├── module1
│   ├── __init__.py
│   └── sample.py
└── tests
    └── test_sample.py

2

ในกรณีของฉันฉันทำงานในคอนเทนเนอร์และ pytest โชคไม่ดีมีแนวโน้มที่จะใช้ python2.7 มากกว่าล่าม python3 ที่ฉันเลือก

ในกรณีของฉันสิ่งนี้ได้ผล:

python3 -m pytest

โครงสร้างโฟลเดอร์ของฉัน

/
app/
-module1.py
-module2.py
-tests/
--test_module1.py
--test_module2.py
requirements.txt
README.md

1

อีกกรณีพิเศษ:

ฉันมีปัญหาในการใช้สารพิษ ดังนั้นโปรแกรมของฉันทำงานได้ดี แต่การรวมตัวกันผ่านทอกซ์ยังคงบ่น หลังจากติดตั้งแพ็คเกจ (จำเป็นสำหรับโปรแกรม) คุณต้องระบุแพ็คเกจที่ใช้ใน unittests ใน tox.ini เพิ่มเติม

[testenv]
deps =
    package1
    package2 
...

1

ฉันได้รับสิ่งนี้โดยใช้ VSCode ฉันมีสภาพแวดล้อม conda ฉันไม่คิดว่าส่วนขยาย VScode python จะเห็นการอัปเดตที่ฉันทำ

python c:\Users\brig\.vscode\extensions\ms-python.python-2019.9.34911\pythonFiles\testing_tools\run_adapter.py discover pytest -- -s --cache-clear test
Test Discovery failed:

ฉันต้องวิ่ง pip install ./ --upgrade


คำสั่ง pip ส่งกลับข้อผิดพลาด:Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
Derek

1

อีกหนึ่งชัยชนะครั้งใหญ่สำหรับระบบนำเข้าของ Python ฉันคิดว่าเหตุผลที่ไม่มีฉันทามติคือสิ่งที่ได้ผลอาจขึ้นอยู่กับสภาพแวดล้อมของคุณและเครื่องมือที่คุณใช้อยู่ด้านบน

ฉันใช้สิ่งนี้จาก VS Code ใน test explorer ภายใต้ Windows ในสภาพแวดล้อม conda Python 3.8

การตั้งค่าที่ฉันต้องใช้คือ:

mypkg/
    __init__.py
    app.py
    view.py
tests/
    test_app.py
    test_view.py

ภายใต้ Intellisense การตั้งค่านี้ใช้งานได้และทดสอบการค้นพบเช่นกัน

โปรดทราบว่าฉันเดิมพยายามต่อไปนี้ตามคำแนะนำของที่นี่

src/
    mypkg/
        __init__.py
        app.py
        view.py
tests/
    test_app.py
    test_view.py

ฉันไม่พบวิธีที่จะทำให้สิ่งนี้ทำงานจาก VS Code ได้เพราะsrcโฟลเดอร์นั้นทำให้ระบบนำเข้าเข้าใจ ฉันสามารถจินตนาการได้ว่ามีวิธีทำให้สิ่งนี้ทำงานได้จากบรรทัดคำสั่ง เนื่องจากการแปลงเป็นโปรแกรม Python ค่อนข้างใหม่ทำให้ฉันรู้สึกคิดถึงการทำงานกับ COM แต่รู้สึกสนุกน้อยลงเล็กน้อย


1

2 เซ็นต์ของฉันเกี่ยวกับสิ่งนี้: pytest จะล้มเหลวหากคุณไม่ได้ใช้สภาพแวดล้อมเสมือนจริง บางครั้งมันก็ใช้ได้ผลบางครั้งก็ไม่

ดังนั้นวิธีแก้ปัญหาคือ:

  • ลบ pytest ด้วยการถอนการติดตั้ง pip
  • สร้าง Venv ของคุณ
  • เปิดใช้งาน venv ของคุณ
  • pip ติดตั้งเส้นทางโครงการของคุณในโหมดที่แก้ไขได้ดังนั้น pytest จะถือว่าเป็นโมดูล (มิฉะนั้น pytest จะไม่พบการนำเข้าภายในของคุณ) คุณจะต้องมีไฟล์ setup.py สำหรับไฟล์นั้น
  • ติดตั้งแพ็คเกจของคุณรวมถึง pytest
  • สุดท้ายทำการทดสอบของคุณ

รหัสโดยใช้ Windows PowerShell:

pip uninstall pytest
python.exe -m venv my_env
.\my_env\Scripts\activate
(my_env) pip install -e .
(my_env) pip install pytest pytest-html pandas numpy

แล้วในที่สุด

(my_env) pytest --html="my_testing_report.html"

ตัวอย่างของ setup.py สำหรับ pip install -e:

import setuptools

setuptools.setup(
    name='my_package',
    version='devel',
    author='erickfis',
    author_email='erickfis@gmail.com',
    description='My package',
    long_description='My gooood package',
    packages=setuptools.find_packages(),
    classifiers=[
        'Programming Language :: Python :: 3',
        'Operating System :: OS Independent',
    ],
    include_package_data=True
)

1

ฉันไม่เห็นด้วยกับโพสต์ที่บอกว่าคุณต้องลบ__init__.pyไฟล์ใด ๆ สิ่งที่คุณต้องทำแทนคือเปลี่ยนไฟล์sys.path.

ทำการทดสอบโดยที่คุณพิมพ์sys.pathเมื่อรันโค้ดตามปกติ จากนั้นพิมพ์sys.pathขณะรันโค้ดผ่าน pytest ฉันคิดว่าคุณจะพบว่ามีความแตกต่างระหว่างสองเส้นทางนี้ดังนั้นทำไม pytest จึงแตก

ในการแก้ไขปัญหานี้ให้แทรกเส้นทางจากการทดสอบแรกที่ดัชนี 0 ของวินาที

ให้'/usr/exampleUser/Documents/foo'เป็นองค์ประกอบแรกprint(sys.path)สำหรับการทดลองที่ 1

ด้านล่างนี้คือรหัสที่ควรแก้ไขปัญหาของคุณ:

import sys sys.path[0] = '/usr/exampleUser/Documents/foo'

วางไว้ที่ด้านบนสุดของไฟล์ก่อนคำสั่งนำเข้าจริง

ที่มา: ฉันกำลังจัดการกับสิ่งนี้ด้วยตัวเองและกระบวนการข้างต้นแก้ไขได้


1

เก็บทุกอย่างไว้เหมือนเดิมและเพิ่มไฟล์ทดสอบเปล่าที่โฟลเดอร์รูท ..แก้ไขได้แล้ว

นี่คือข้อค้นพบปัญหานี้ทำให้ฉันรู้สึกแย่อยู่พักหนึ่ง โครงสร้างโฟลเดอร์ของฉันคือ

mathapp/
    - server.py  
    - configuration.py 
    - __init__.py 
    - static/ 
       - home.html  
tests/            
    - functional 
       - test_errors.py 
    - unit  
       - test_add.py

และ pytest จะบ่นกับ ModuleNotFoundError และให้คำแนะนำ - ตรวจสอบให้แน่ใจว่าโมดูล / แพ็คเกจทดสอบของคุณมีชื่อ Python ที่ถูกต้อง

ฉันแนะนำไฟล์ทดสอบจำลองในระดับเดียวกับไดเร็กทอรี mathsapp และการทดสอบ ไฟล์ไม่มีอะไรเลย ตอนนี้ pytest ไม่บ่น

ผลลัพธ์ที่ไม่มีไฟล์

$ pytest
============================= test session starts =============================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\mak2006\workspace\0github\python-rest-app-cont
collected 1 item / 1 error

=================================== ERRORS ====================================
_______________ ERROR collecting tests/functional/test_func.py ________________
ImportError while importing test module 'C:\mainak\workspace\0github\python-rest-app-cont\tests\functional\test_func.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests\functional\test_func.py:4: in <module>
    from mathapp.service import sum
E   ModuleNotFoundError: No module named 'mathapp'
=========================== short test summary info ===========================
ERROR tests/functional/test_func.py
!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
============================== 1 error in 0.24s ===============================

ผลลัพธ์กับไฟล์

$ pytest
============================= test session starts =============================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\mak2006\workspace\0github\python-rest-app-cont
collected 2 items

tests\functional\test_func.py .                                          [ 50%]
tests\unit\test_unit.py .                                                [100%]

============================== 2 passed in 0.11s ==============================

สิ่งนี้ใช้ได้ผลสำหรับฉันหลังจากใช้เวลานานกับปัญหานี้ ดูเหมือนว่า pytest จะปฏิบัติต่อรูทโปรเจ็กต์ทุกที่ที่พบไฟล์ทดสอบแรก นี่คือข้อผิดพลาดหรือไม่?
oooyaya

1

ฉันแก้ไขปัญหาของฉันโดยการตั้งค่าไฟล์ PYTHONPATHตัวแปรสภาพแวดล้อมสำหรับการกำหนดค่าเฉพาะที่ฉันใช้การทดสอบด้วย

ในขณะที่คุณกำลังดูไฟล์ทดสอบบน PyCharm:

  1. Ctrl+Shift +A
  2. ประเภท Edit Configurations
  3. ตั้งค่าของคุณPYTHONPATHภายใต้สภาพแวดล้อม> ตัวแปรสภาพแวดล้อม

0

อาจเป็นไปได้ว่า Pytest ไม่ได้อ่านแพ็คเกจเป็นโมดูล Python ในขณะที่ Python นั้น (น่าจะเกิดจากปัญหาเส้นทาง) ลองเปลี่ยนไดเร็กทอรีของสคริปต์ pytest หรือเพิ่มโมดูลลงใน PYTHONPATH ของคุณอย่างชัดเจน

หรืออาจเป็นไปได้ว่าคุณมี Python สองเวอร์ชันติดตั้งอยู่ในเครื่องของคุณ ตรวจสอบแหล่งที่มา Python ของคุณเพื่อหา pytest และสำหรับ python shell ที่คุณเรียกใช้ หากแตกต่างกัน (เช่น Python 2 vs 3) ให้ใช้source activateเพื่อให้แน่ใจว่าคุณกำลังเรียกใช้ pytest ที่ติดตั้งสำหรับ python เดียวกันกับที่ติดตั้งโมดูล


0

สำหรับใครก็ตามที่ลองทุกอย่างแล้ว แต่ยังคงได้รับข้อผิดพลาดฉันมีวิธีแก้ไข

ในโฟลเดอร์ที่ติดตั้งpytestให้ไปที่pytest-envโฟลเดอร์

เปิด ไฟล์pyvenv.cfg

ในการเปลี่ยนแปลงไฟล์รวมถึงระบบ-site-แพคเกจจากเท็จจะจริง

home = /usr/bin
include-system-site-packages = true
version = 3.6.6

หวังว่าจะได้ผลอย่าลืมโหวต


0

หากคุณมีไฟล์. pyc อยู่แล้วให้ลองลบออก

วันนี้ฉันพบปัญหานี้นี่คือสิ่งที่เกิดขึ้น:

ก่อนอื่นฉันเรียกใช้ pytest ใน mac (สิ่งนี้จะสร้างไฟล์ pyc) จากนั้นฉันจึงเปิดคอนเทนเนอร์นักเทียบท่า (ระบบปฏิบัติการเป็นอัลไพน์) พร้อมกับติดตั้งโครงการ dir จากนั้นเมื่อฉันพยายามเรียกใช้ pytest ในคอนเทนเนอร์ ImportError ก็เกิดขึ้น หลังจากทำความสะอาดไฟล์ pyc ทั้งหมดแล้วจะไม่มีข้อผิดพลาดอีกต่อไป

หวังว่านี่อาจเป็นประโยชน์


0

หากคุณต้องการไฟล์init. py ในโฟลเดอร์ของคุณให้สร้างสำเนาของโฟลเดอร์และลบinit .py ในโฟลเดอร์นั้นเพื่อเรียกใช้การทดสอบของคุณว่าใช้ได้กับโครงการในพื้นที่ หากคุณจำเป็นต้องเรียกใช้การทดสอบเป็นประจำดูว่าคุณสามารถย้ายinit .py ไปยังไฟล์แยกต่างหากได้หรือไม่


0

[แก้ไขแล้ว] ก่อนที่จะเข้าสู่โซลูชันการลบ / เพิ่ม__init__.pyโดยตรงเราอาจต้องการดูวิธีการนำเข้าในชั้นเรียนของคุณ อันที่จริงฉันเสียเวลาไปหนึ่งวันกับการเล่นเฉยๆ__init__.pyคิดว่านั่นอาจเป็นปัญหา :) อย่างไรก็ตามนั่นเป็นข้อมูลที่ค่อนข้างดี

ในกรณีของฉันมันเป็นวิธีที่ผิดในการเรียกคลาสจากคลาส python หนึ่งไปยังคลาส python อื่นที่กำลังขว้าง ImportErrorในกรณีของฉันมันเป็นวิธีที่ไม่ถูกต้องของการเรียกชั้นเรียนจากชั้นหนึ่งไปเรียนหลามหลามอีกซึ่งถูกขว้างปาแก้ไขวิธีการเรียกคลาส / โมดูลและทำงานเหมือนมีเสน่ห์ หวังว่านี่จะช่วยคนอื่นเช่นกัน

และใช่สำหรับข้อผิดพลาดที่คล้ายกันเราอาจมีวิธีแก้ไขปัญหาที่แตกต่างกันขึ้นอยู่กับวิธีการเขียนโค้ด ดีกว่าที่จะใช้เวลามากขึ้นในการแก้ไขจุดบกพร่องด้วยตนเอง บทเรียนที่เรียนรู้ :) Happy coding !!!


2
คุณช่วยยกตัวอย่างวิธีที่ผิดและวิธีที่ถูกต้องได้ไหม
Lurifaxel

0

ฉันมีปัญหาเดียวกันฉันติดตั้ง pytest ใน venv ที่ฉันเปิดอยู่จากนั้นมันก็เริ่มทำงาน

pip ติดตั้ง pytest

ดังนั้นความเข้าใจของฉันคือเมื่อ pytest ทำงานจากการติดตั้งทั่วโลกมันไม่สามารถเลือกโมดูลที่ติดตั้งใน venv ที่แพร่หลายได้


-1

แก้ไข conftest.py ของคุณและเพิ่มโค้ดบรรทัดต่อไปนี้:

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

และหากพยายามรันกรณีทดสอบผ่านเทอร์มินัลให้ใช้ตัวอย่างต่อไปนี้:

python -m pytest test_some_step_file_steps.py --html=HTML_step_file_output.html --self-contained-html

1
NameError: name 'file' is not defined- ไฟล์ควรเท่ากับอะไร?
Koshmaar

-1

ฉันวางการทดสอบทั้งหมดไว้ในโฟลเดอร์การทดสอบแล้วและได้รับข้อผิดพลาดเดียวกัน ฉันแก้ไขสิ่งนี้โดยการเพิ่มinit. py ในโฟลเดอร์นั้นดังนี้:

.
|-- Pipfile
|-- Pipfile.lock
|-- README.md
|-- api
|-- app.py
|-- config.py
|-- migrations
|-- pull_request_template.md
|-- settings.py
`-- tests
    |-- __init__.py <------
    |-- conftest.py
    `-- test_sample.py
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.