首页 > 解决方案 > Django 测试不使用 AssertRaises 添加覆盖率

问题描述

当它们被称为 self.assertRaises 时,有两行没有被 django 测试执行。

我正在使用:Python 3.6.9、Django 3、Coverage。

我有这堂课:

class AverageWeatherService:
    subclasses = WeatherService.__subclasses__()
    valid_services = {
        subclass.service_key: subclass for subclass in subclasses
    }

    @classmethod
    def _check_service(cls, one_service):
        if one_service not in cls.valid_services:
            logger.exception("Not valid service sent")
            raise NotValidWeatherFormException("Not valid service sent")

我的电脑中有一个本地 API。

然后我写了这个测试:

def test_integration_average_temp_services_error(self):
    self.assertRaises
    (
        NotValidWeatherFormException,
        AverageWeatherService()._check_service,
        "MyFakeService",
    )

尽管正确使用了 assert raises 测试成功,但此测试并未增加覆盖率,但如果我以错误的方式调用此方法,如下所示:

def test_integration_average_temp_services_error2(self):
    self.assertRaises
    (
        NotValidWeatherFormException,
        AverageWeatherService()._check_service("MyFakeService")
    )

然后当然我在运行测试时遇到错误,因为异常被引发并且没有被 assertRaises 正确捕获但是它增加了覆盖率。如果我错误地运行了这个测试,我的代码 100% 被覆盖了。如果我使用 assertRaises 作为不覆盖这两行的第一种方式(根据覆盖率 html)。

logger.exception("Not valid service sent")
raise NotValidWeatherFormException("Not valid service sent")

此外,如果我以第一种方式执行该方法,则控制台中不会显示记录器异常,并且当我以第二种方式运行测试时,我能够在终端上可视化 logger.exception。

关于发生了什么的任何想法?

提前致谢。

标签: pythondjangocode-coveragedjango-testingdjango-tests

解决方案


我可以解决它。

这是解决方法:

def test_integration_average_temp_services_error(self):
    with self.assertRaises(NotValidWeatherFormException):
        AverageWeatherService()._check_service("MyFakeService")

推荐阅读