How do I get 100% in my model coverage tests?

I have set up coverage for my Django project. Output:

     Name                               Stmts   Miss  Cover   
    ----------------------------------------------------------------
    test.apps.testapp.models.company     15      5    67%   2, 19-25
    ------------------------------------------------------------

      

I've tested everything I can think of for this model, what are the 5 missing links?

Here is my model:

class Company(models.Model):
    """
    Describes a Company within the system.
    """
    name = models.CharField(max_length=60)
    address_line1 = models.CharField(max_length=120)
    address_line2 = models.CharField(max_length=120, null=True, blank=True)
    address_city = models.CharField(max_length=120)
    address_county = models.CharField(max_length=120, null=True, blank=True)
    address_country = models.CharField(max_length=4, choices=COUNTRY_CHOICES, default="US")
    address_postcode = models.CharField(max_length=12)

    class Meta:
        app_label = "testapp"

    def company_user_count(self):
        """
        Return count of the numbers of users that belong to a company.
        :return: int
        """
        return self.users.count()

      

My tests:

class CompanyModel(TestCase):

    def setUp(self):
        self.company = CompanyFactory.create()

    def tearDown(self):
        pass

    def test_create_new_company_creation(self):
        """
        Ensure that a new company can be created.
        """
        company = CompanyFactory(name="Test Co")
        noz.assert_equal(company.name, "Test Co")

    def test_user_is_company(self):
        """
        Test relationship on user to company method is_company_user().
        """
        company = CompanyFactory.create()
        company_user = UserFactory.create(company=company)
        noz.assert_equal(company_user.is_company_user(), True)

    def test_company_user_relationship(self):
        """
        Test correct relationship on company is made to user.
        """
        company = CompanyFactory.create()
        user = UserFactory.create(company=company)
        noz.assert_equal(user.company.name, "Valhalla Ltd")


    def test_one_to_many_company_relationship(self):
        """
        Test company relationship of one-to-many with users.
        """
        company = CompanyFactory.create()
        user1 = UserFactory.create(company=company)
        user2 = UserFactory.create(company=company)
        company.company_user_count()
        noz.assert_equal(company.company_user_count(), 2)

      

+3


source to share


3 answers


Run the coverage utility with html output and it will tell you which lines or branches you failed to check out.

If you are using django-nose to run the tests, add the parameter --cover-html

and --cover-html-dir=<DIR>

the settingNOSE_ARGS

.



See the approximate output from the scope documentation.

+3


source


There are 5 statements that your test does not cover, usually beyond the conditional. For example, if you have:

if val == 3:
    return 0
else:
    return 1

      

And you don't try val = 3

, then there will be a statement that will not be covered by the test.



Your tests don't matter. What matters is what they do with the project under test. You should check the coverage, I recommend doing cov.html_report

it because I'm used to the coverage module. html_report

will give a nice html folder full of data from the project under test and you will see what is missing.

Example:

import coverage
cov = coverage.coverage( ...)
cov.start()

# do something about unittest and running the test

cov.stop()
cov.save()
cov.html_report(directory='./html_folder')

      

+1


source


If you are using django-nose

, there is a problem with the wrong coverage for the models .

Using the coverage itself without the Django plugin shows the correct result for coverage:

coverage erase
coverage run --branch ./manage.py test
coverage report -m

      

+1


source







All Articles