I have a simple django project that I'm making in pycharm. The directory structure is the following:
zelda_botw_cooking_simulator
|-- cooking_simulator_project
|---- manage.py
|---- botw_cooking_simulator # django app
|------ init.py
|------ logic.py
|------ tests.py
|------ all_ingredients.py
|------ other standard django app files
|---- cooking_simulator_project # django project
|------ manage.py
|------ other standard django project files
When I run python manage.py test
in the PyCharm terminal, everything works great.
When I click the little triangle icon in PyCharm next to a test to run that test, however, I get one of two errors depending on how I've tried to configure the configuration for testing in PyCharm:
Error 1:
File ".../zelda_botw_cooking_simulator/cooking_simulator_proj/botw_cooking_simulator/tests.py", line 5, in <module>
from .all_ingredients import all_ingredients
ImportError: attempted relative import with no known parent package
Error 2:
/opt/homebrew/anaconda3/envs/zelda_botw_cooking_simulator/bin/python /Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_manage.py test botw_cooking_simulator.tests.TestAllIngredients.test_hearty_durian /Users/brendenmillstein/Dropbox (Personal)/BSM_Personal/Coding/BSM_Projects/zelda_botw_cooking_simulator/cooking_simulator_proj
Testing started at 10:05 PM ...
Traceback (most recent call last):
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_manage.py", line 168, in <module>
utility.execute()
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_manage.py", line 142, in execute
_create_command().run_from_argv(self.argv)
File "/opt/homebrew/anaconda3/envs/zelda_botw_cooking_simulator/lib/python3.10/site-packages/django/core/management/commands/test.py", line 24, in run_from_argv
super().run_from_argv(argv)
File "/opt/homebrew/anaconda3/envs/zelda_botw_cooking_simulator/lib/python3.10/site-packages/django/core/management/base.py", line 413, in run_from_argv
self.execute(*args, **cmd_options)
File "/opt/homebrew/anaconda3/envs/zelda_botw_cooking_simulator/lib/python3.10/site-packages/django/core/management/base.py", line 459, in execute
output = self.handle(*args, **options)
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_manage.py", line 104, in handle
failures = TestRunner(test_labels, **options)
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_runner.py", line 254, in run_tests
return DjangoTeamcityTestRunner(**options).run_tests(test_labels,
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_runner.py", line 156, in run_tests
return super(DjangoTeamcityTestRunner, self).run_tests(test_labels, extra_tests, **kwargs)
TypeError: DiscoverRunner.run_tests() takes 2 positional arguments but 3 were given
Process finished with exit code 1
How can I fix this?
I have tried configuring run environments and test environments in PyCharm for 2 hours now and I'm not getting it. The questions/answers here and here are close, but there's not quite enough detail for me to fix it. Exactly what do I put in each field in each window? What's the 'target', the 'working directory', do I need an environment variable? What goes in the settings part and what goes in the configuration?
ChatGPT recommended a bunch of stuff that didn't work, and I can't seem to find a YouTube video showing the right way to do this. Thank you!
**** Expanding Answer in Response to Comments/Questions ****
Here is my tests.py code:
from datetime import timedelta
from django.test import TestCase
from .all_ingredients import all_ingredients
from .data_structures import MealType, MealResult, MealName, SpecialEffect, EffectLevel
from .logic import (
determine_meal_type,
simulate_cooking,
check_if_more_than_one_effect_type,
calculate_sell_price,
)
# Create your tests here.
class TestAllIngredients(TestCase):
def test_hearty_durian(self):
ingredient = all_ingredients["Hearty Durian"]
self.assertEqual(ingredient.effect_type.value, "Hearty")
self.assertEqual(ingredient.category.value, "Fruit")
self.assertEqual(ingredient.price, 15)
self.assertEqual(ingredient.base_hp, 12)
self.assertEqual(ingredient.bonus_hp, 0)
self.assertEqual(ingredient.base_time, timedelta(seconds=00))
self.assertEqual(ingredient.bonus_time, timedelta(seconds=00))
self.assertEqual(ingredient.potency, 4)
etc.
Here is a screenshot of the configuration:
Thank you!!
Figured it out! The problem lay in how PyCharm was interpreting the test. The question and answer here was super helpful, but I had to do the opposite and add a working directory:
Replace from django.test import TestCase
with from unittest import TestCase
in my tests.py file.
Add the working directory to the templates. Note I had to update the autodetect template, not only the unittest template:
First: select Make sure to select 'Edit Configuration Templates', don't just update one.
Second: select autodetect within the Python tests menu option. Then update the working directory to be the one with your manage.py file in it.
Now the little green buttons work!