Description:
C:.
├───Shapes
│ │ Circle.py
│ │ Rectangle.py
│ │ Shape.py
│ │ __init__.py
│
├───tests
│ │ conftest.py
│ │ test_circle.py
│ │ test_rectangle.py
Circle.py
and Rectangle.py
, I'm getting the error "No module named 'Shapes'" when trying to run the scripts. Additionally, when attempting to run tests in the tests
directory, I encounter the error: "ModuleNotFoundError: No module named 'Shapes'".# Circle.py
from Shapes.Shape import Shape # Importing the Shape base class
import math as Math
class Circle(Shape):
def __init__(self, radius=0):
self.radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, radius):
self._radius = max(1, radius)
def area(self):
return Math.pi * Math.pow(self.radius, 2)
# ... (rest of the code)
# Rectangle.py
from Shapes.Shape import Shape # Importing the Shape base class
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
@property
def width(self):
return self._width
@property
def height(self):
return self._height
@width.setter
def width(self, width):
self._width = width
@height.setter
def height(self, height):
self._height = height
def area(self):
return self.height * self.width
# ... (rest of the code)
# test_circle.py
import pytest
from Shapes.Circle import Circle
import math as Math
class TestCircle:
def setup_method(self, method):
# Setting up the test environment
self.circle = Circle(2)
def teardown_method(self, method):
# Tearing down the test environment
pass
def test_radius(self):
assert self.circle.radius == 2
def test_area(self):
assert self.circle.area() == Math.pi * Math.pow(self.circle.radius, 2)
# test_rectangle.py
import pytest
from Shapes.Rectangle import Rectangle
def test_area():
assert object.area() == 6 # Assuming object is an instance of Rectangle with width=2 and height=3
Error Messages:
Circle.py
or Rectangle.py
, I get the error:No module named 'Shapes'
tests
directory, I encounter:ModuleNotFoundError: No module named 'Shapes'
Attempts to Resolve:
I've tried adding the project root to the sys.path
in the test files, but its not best practise and I'm looking for a cleaner solution.
Using relative imports didn't resolve the issue just got.
Exception has occurred: ImportError
attempted relative import with no known parent package
Question:
What I Tried:
Attempted to run Circle.py
and Rectangle.py
scripts and executed tests in the tests
directory. Explored relative imports and considered adding the project root to sys.path
.
Expected:
Scripts to run without ImportError for 'Shapes'. Tests to execute successfully without "No module named 'Shapes'" error.
Actual Result:
Received ImportError for 'Shapes' when running scripts and ModuleNotFoundError
in tests.
It looks like I found the solution to the issue I was facing. The problem arises when running tests directly from the terminal using
pytest tests/
or
python pytest tests/
In these cases, pytest treats the tests/ directory as the root of the project, leading to import errors.
To resolve this, I discovered that running tests as a module with
python -m pytest tests/
Solves the problem. By using -m, I explicitly indicate that tests is a module, and now the import paths are handled correctly.