如何获得forloop中unittest的覆盖率?

2024-09-26 17:52:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在修补BeautifulSoup.select时用assertRaises测试一个异常

方法,该方法从网页获取ID,并接收html resultsPage

def parseOutIds(resultsPage):

    soup = BeautifulSoup(resultsPage, "html.parser")

    records = soup.select('some-html-tags')
    parsed = []
    for record in records:
        try:
            ampData = json.loads(record["other-tags"])
            parsed.append(ampData)
        except json.decoder.JSONDecodeError from err # Missing coverage

    return parsed

上述辅助方法及试验。我提出ValueError,因为json.decoder.JSONDecodeError基于这个answer继承自它

def loadHtml(self, fileName):
    with open('path/to/test'+filename) as f:
         self.html = file.read().strip()

def test_parseOutIds(self):
    self.loadHtml('test-html.html')

    #errorMock method just raises ValueError exception
    bsPatch = patch('bs4.BeautifulSoup.select', self.errorMock) 
    with bsPatch:
        with self.assertRaises(ValueError):
             parseOutIds(self.html)

我上面的当前测试缺少异常行的第页

其他要点:

  1. 我也需要修补json.load吗
  2. 从我从其他答案中看到的情况来看,我是否也会因为存在循环而模仿另一种方法

Tags: 方法testselfjsondefhtmlwithparsed
1条回答
网友
1楼 · 发布于 2024-09-26 17:52:50

您的代码中有一些误解:

  • ValueError不会被except json.decoder.JSONDecodeError子句捕获-您可以从json.decoder.JSONDecodeError派生的类捕获对象,但不能从json.decoder.JSONDecodeError捕获父类
  • soup.select调用在try块之外,因此从soup.select抛出的异常无论如何都不会被捕获

现在,关于您的测试问题:我认为您可能不必修补任何东西来测试parseOutIds。您只需要为相应的测试用例提供适当的html输入。在您的例子中,您希望编写一个测试来覆盖异常部分。这意味着,所需的html输入将有一个记录包含无效的JSON数据。这将导致json.loads抛出json.decoder.JSONDecodeError

相关问题 更多 >

    热门问题