Django测试没有使用AssertRaises增加覆盖率。

问题描述 投票:0回答:1

当django测试调用self.assertRaises时,有两行字没有被执行。

我使用的是 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,在我的PC上。

然后我写了这个测试。

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异常没有显示在控制台,而当我以第二种方式运行测试时,我能够在终端上看到logger.exception。

有什么办法可以解决这个问题吗?

先谢谢你了。

python django code-coverage django-testing django-tests
1个回答
0
投票

我可以解决它。

这就是工作方法。

def test_integration_average_temp_services_error(self):
    with self.assertRaises(NotValidWeatherFormException):
        AverageWeatherService()._check_service("MyFakeService")
© www.soinside.com 2019 - 2024. All rights reserved.