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)
source to share
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.
source to share
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')
source to share
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
source to share