Python Django单元测试&x27;其他';声明以期实现覆盖率

Python Django单元测试&x27;其他';声明以期实现覆盖率,python,django,unit-testing,code-coverage,Python,Django,Unit Testing,Code Coverage,我正在为我的界面应用程序运行django测试覆盖率。下面的视图调用了一个WelcomeMessage模型,基本上表示如果该查询集中没有消息,则默认为“欢迎…”,如果有多个“活动”,则显示最近的消息。基本上,当有超过1条活动消息时,如何测试else行 我尝试创建了两个不同的WelcomeMessage实例,其中一个是最近的,但当我运行coverage时,它仍然将else段高亮显示为红色 运行覆盖范围包括: coverage run--source='.'manage.py测试接口 视图: 单元测试

我正在为我的
界面
应用程序运行django测试覆盖率。下面的视图调用了一个
WelcomeMessage
模型,基本上表示如果该查询集中没有消息,则默认为“欢迎…”,如果有多个“活动”,则显示最近的消息。基本上,当有超过1条活动消息时,如何测试
else

我尝试创建了两个不同的
WelcomeMessage
实例,其中一个是最近的,但当我运行coverage时,它仍然将
else
段高亮显示为红色

运行覆盖范围包括:
coverage run--source='.'manage.py测试接口

视图:

单元测试:

 def test_indexWelcomeMessage(self):
        welcome1 = WelcomeMessage.objects.create(
            created_at=datetime(2019, 1, 1),
            modified_at=datetime(2019, 1, 1),
            active=True,
            msg="Welcome message"
        )
        welcome2 = WelcomeMessage.objects.create(
            created_at=datetime.now(),
            modified_at=datetime.now(),
            active=True,
            msg="Recent welcome message"
        )
        messages = WelcomeMessage.objects.filter(
            active=True).order_by('-modified_at')

        if len(messages) == 0:
            msg = "testing this message"
        else:
            msg = messages[0]
        recentMsgVal = getattr(welcome2, 'msg')
        msg = messages[0]
        expectedMsgVal = messages.values_list('msg', flat=True).first()
        self.assertNotEqual(len(messages), 0)
        self.assertEqual(recentMsgVal, expectedMsgVal) # These asserts pass, but no coverage.
Welcome消息模型:

class WelcomeMessage(models.Model):
    created_at = models.DateTimeField(
        auto_now_add=True, verbose_name='Created')
    modified_at = models.DateTimeField(
        auto_now=True, verbose_name="Last change")
    active = models.BooleanField(default=True)
    msg = models.TextField(null=True, verbose_name='Message')

如何编写一个测试,使其覆盖
else
语句?

据我所知,您没有直接或间接地调用此测试用例上的
index()
方法。为了证明这一点,您可以添加一个调试器(
ipdb
pycharm调试器
-无所谓),或者在else语句上引发一些错误,然后再次运行测试。它应该像以前一样运行

如果你想写测试用例,看看这个例子这个例子 在您的情况下,它应该是这样的:

def test_index_welcome_message(self):
    welcome1 = WelcomeMessage.objects.create(
    created_at=datetime(2019, 1, 1),
        modified_at=datetime(2019, 1, 1),
        active=True,
        msg="Welcome message"
    )
    welcome2 = WelcomeMessage.objects.create(
        created_at=datetime.now(),
        modified_at=datetime.now(),
        active=True,
        msg="Recent welcome message"
    )
    messages = WelcomeMessage.objects.filter(
        active=True).order_by('-modified_at')
    # this needed in case route needs auth
    self.client.login(username='user', password='test')
    response = self.client.get('/url/to/index/view')
    assert response == expected_response


p、 s.
self.client
django.test.client
的实例,但是检查您的项目
BaseTestCase
,您可能已经定义了一个。

添加
响应=self.client.get(
成功了!我在上面的另一个方法中使用了相同的客户端响应测试代码,我不知道我需要在上面的unittest中使用另一个语句。我想我正在了解这正是测试if/else分支时需要的。谢谢!
def test_index_welcome_message(self):
    welcome1 = WelcomeMessage.objects.create(
    created_at=datetime(2019, 1, 1),
        modified_at=datetime(2019, 1, 1),
        active=True,
        msg="Welcome message"
    )
    welcome2 = WelcomeMessage.objects.create(
        created_at=datetime.now(),
        modified_at=datetime.now(),
        active=True,
        msg="Recent welcome message"
    )
    messages = WelcomeMessage.objects.filter(
        active=True).order_by('-modified_at')
    # this needed in case route needs auth
    self.client.login(username='user', password='test')
    response = self.client.get('/url/to/index/view')
    assert response == expected_response