Search code examples
djangodjango-tests

How can I pass in a parameter to my TestCase in Django?


Using an edited version of the example from Django's own doc, lets say my code looks like this:

from django.test import TestCase
from myapp.models import Animal

class AnimalTestCase(TestCase):

    def __init__(self, animal_family):
        self.animal_family = animal_family        

    def setUp(self):
        Animal.objects.create(name="lion", sound="roar", family=self.animal_family)

    def test_animals_can_speak(self):
        """Animals that can speak are correctly identified"""
        lion = Animal.objects.get(name="lion")
        self.assertEqual(lion.speak(), 'The mammal lion says "roar"')

Basically, I want to pass in the animal_family parameter into my test, or something similar at least from my terminal. Something like this

python manage.py test myapp.tests.AnimalTestCase 'mammal'

Obviously, the above command does not work. I want to send the 'mammal' as the animal_family to the __init__ method in my test class.

Help would be greatly appreciated.


Solution

  • Whilst self-contained tests should be the best practice, if you really wanted to do this you could set an environment variable when you execute the test command.

    For example:

    import os
    from django.test import TestCase
    from myapp.models import Animal
    
    class AnimalTestCase(TestCase):      
    
        def setUp(self):
            # Retrieve the animal family from the environment variable
            animal_family = os.environ['animal_family']
            Animal.objects.create(name="lion", sound="roar", family=animal_family)
    
        def test_animals_can_speak(self):
            """Animals that can speak are correctly identified"""
            lion = Animal.objects.get(name="lion")
            self.assertEqual(lion.speak(), 'The mammal lion says "roar"')
    

    And then call the test command such as:

    export animal_family=mammal;python manage.py test myapp.tests.AnimalTestCase