Unit Tests why would you need this at all?

1. Unit tests and regression testing!

Gives you confidence of not breaking your previous features by creating new features.

2. Program some more!

When you create unit-tests you have to think-through on the source-code to be proper applied to the tests.

From my own experience I have to confess - there were times when I've changed source-code of application to support properly unit-tests.

3. Time-saver !

You code new feature, you are not sure and have no proper time to test if all of "old" features are working properly.

Then you use your previously created unit-tests and find-out if at the "unit" stage, you got something broke or not.

How to use django integrated tests?

Django integrated tests uses python unittest module. This is setup with integration to django, thanks to which to run initial tests simply:

python manage.py test

But when you find yourself creating multiple django "applications" this will not work. You may need to add something like this:

python manage.py test application_directory

In my project I've added to Makefile :

python bikingendorphines/manage.py test web

How to create unit tests that are integrated with Django Framework?

Code below show how to setup your initial first test. This is placed in "test*.py" files.

"""
Unit tests for web-application.
"""
# disabling because this import will be used in future
# pylint: disable=unused-import
from django.test import TestCase
from .models import User

class UserTestCase(TestCase):
    """
    A User-class test-case
    """

    def setUp(self):
        User.objects.create(name='Bart', weight=80, height=175)
        User.objects.create(name='Trab', weight=99, height=175)

    def test_user_bmi(self):
        """
        Tests if users has been created in db
        """
        bart = User.objects.get(name='Bart')
        trab = User.objects.get(name='Trab')
        self.assertEqual(bart.bmi(), (80/(175*175)* 10000))
        self.assertEqual(trab.bmi(), (99/(175*175)* 10000))

The User class itself I've defined in this way:

class User(models.Model):
    """
    User model for obtaining personal information about biking riders
    """
    name = models.CharField(max_length=50)
    weight = models.IntegerField(default=0)
    height = models.IntegerField(default=0)

    def __unicode__(self):
        """
        Returns User information when using str/printing
        """
        return self.name

    def bmi(self):
        """
        Body Mass Index calculator simplified to number
        """
        return (self.weight / (self.height * self.height)) * 10000

Code commits done for this post:

Adds django-unit tests to Travis

Adds Web Application and pylint fixes

Add Initial unit-tests with User db class

LL (Lessons Learned)

1. Allowed_Hosts problem.

I finally was at the stage when I wanted to see if at least the debug page for djagno will popup.

But didn't know that django developers change default behaviour of ALLOWED_HOSTS and now does not add the "star" (as all-hosts allowed)

Solution:

Since I'm using VM that is simply a server-based - I had to a change allowed_hosts variable at the bikingendorphines/bikingendorphines/settings.py file with:

ALLOWED_HOSTS = [*]

2. Pylint errors.

Pylint was not optimized as I found out at the coding stage with some django - elements i.e. objects at the Models.

Pylint issue with not recognizing "migration" django scripts and finding lint-errors. I wouldn't mind if I had to manually create this files, but they were made automatically at the python manage.py makemigrations phase.

Solution:

Added pylint_django python module using pip install pylint_django and added --load-plugins pylint_django to my Makefile task that is used by Travis to complete pylint tests.

Added migrations to .pylintrc file within section ignore.

3. Pylint and Django-unit tests errors

I had some issues when integrating together Pylint and Django-Unit tests.

Solution:

For django-unit test to properly work I had to firstly remove the __init__.py python file that describes directory as a module - at the root of the bikingendorhpines project dir.

I had to change pylint to search for particular folders to find lint-errors in web- "application"

Acknowledgements

Django Tutorial- Writing and running tests

Django Models Tutorial

Django Applications

Pylint Ignore Directory at stackoverflow

Using Pylint at Django-Based projects - landscape Blog

What's Next ??

  • PyReverse to create a PNG files with all classes at Django and our project.

  • Check what I've got to do in issues of github: ISSUES



Comments

comments powered by Disqus