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