在Python中单元测试网络爬虫
我刚接触单元测试,想为我写的网页抓取工具写一些测试。我的抓取工具从本地磁盘上的网站收集数据,不同的日期输入会得到不同的结果。
我的脚本中有以下这个函数。
get_date [returns date mentioned on web page]
get_product_and_cost [returns product mentioned and their cost]
我不太确定应该测试这些函数中的哪些部分。到目前为止,我写了这个。
class SimplisticTest(unittest.TestCase):
def setUp(self):
data = read_file("path to file")
self.soup = BeautifulSoup(data,'html5lib')
def test_date(self):
self.assertIsInstance(get_date(self.soup), str)
def test_date_length(self):
self.assertEqual(len(get_date(self.soup)),10)
if __name__ == '__main__':
unittest.main()
1 个回答
6
通常来说,测试已知输入得到的已知输出是个好主意。在你的例子中,你测试了返回的类型,但更好的做法是检查返回的对象是否符合你对输入的预期,这时候静态测试数据(比如你提到的测试网页)就派上用场了。你还可以使用自带的功能来测试异常,比如用self.assertRaises(ExceptionType, method, args)。如果你还没看过,可以参考一下这个链接。
基本上,你至少要测试一个明确的案例(像测试网页那样),还要测试可能出现的异常,比如错误的参数类型(TypeError或ValueError),或者根据你的函数可能返回的None类型。确保你不仅仅测试返回的类型或数量,而是要明确测试返回的数据,这样如果有改动导致功能出错,就能及时发现(因为即使改动后仍然返回10个元素,但这些元素可能包含无效数据)。我还建议每个方法都写一个测试方法,比如get_date就应该有一个测试方法叫test_get_date。
记住,你要找的是这个方法是否能正常工作,所以要测试一些极端情况(比如尽可能大的输入数据,或者至少是方法定义中能支持的最大值),并尽量创建这些情况,这样如果方法的输出和预期不符(根据它的定义或文档),测试就会失败,从而能早早发现问题。