python中的unittest web scraper

时间:2014-10-19 06:57:16

标签: python unit-testing

我是单元测试的新手。我想为我写的web scraper编写单元测试。我的刮刀收集来自网站的数据,这是在本地磁盘上,输入不同的日期给出了不同的结果

我在脚本中有以下功能。

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 个答案:

答案 0 :(得分:4)

通常,最好从已知输入测试已知输出。在你的情况下,你测试返回类型,但是测试返回的对象是否符合你对输入的期望,以及静态测试数据(你的测试网页)是否更好)变得有用。您还可以使用self.assertRaises(ExceptionType,method,args)测试异常。如果您还没有,请参阅https://docs.python.org/3.4/library/unittest.html

基本上你想测试至少一个显式的情况(比如测试页面),可以引发的异常,如坏参数类型(TypeError或ValueError)或可能的None返回类型,具体取决于你的函数。确保不仅仅测试返回的类型或返回的数量,而是显式地测试数据,这样如果进行了更改以破坏该功能,则会找到它(而更改仍然可以返回10个元素,元素可能包含无效数据)。我还建议为每个方法使用一种测试方法:get_date将使用其测试方法test_get_date。

请记住,您想要找到的是该方法是否能够完成其工作,因此请测试极端情况(大输入数据,尽可能支持或至少方法定义它)并尝试创建它们这样,如果方法的输出与其定义(文档)的预期输出不同,则测试失败,并且很快就会发现重大变化。