我很惭愧承认,但我从来没有对我的代码进行任何自动化测试。通常我会写一个函数或方法,然后做一些手动测试并继续。我意识到这是非常糟糕的做法所以我试图改变我的方式。问题是,我对如何开始有点迷茫。我正在使用连接到数据库的Flask编写一个小的Python Web应用程序,我想用这个机会强迫自己进入更好的开发实践。
我猜我需要用一些测试数据填充我的数据库(可能只是编写脚本来生成它),然后继续为我的程序中的每个函数编写测试。
例如:我有一个函数可以从系统中提取所有用户注释。我是否必须为特定用户编写测试,然后检查以确保返回的注释ID列表与我从手动数据库查询创建的数组匹配?这个单元测试了吗?
只是很难理解这一切。甚至指向一些新的友好文档将非常感激。
答案 0 :(得分:19)
所以,首先,我想提一下自动化测试的目的。目的不是为了发现错误,而是为了捕捉回归。它确实有时会捕获错误,但一般而言,编写和维护自动化测试套件需要做大量的工作。如果您只是想找到错误,那么手动测试要便宜得多。自动化测试的优势在于,您可以在进行实质性更改时运行套件,并且更加自信地没有打破世界。这种回归测试是编写自动化测试的关键所在。
我将描述测试方法,然后介绍一般测试策略。我也只是要解释一切,如果你已经知道我所说的一半,请不要被冒犯。
话虽如此,有三个广泛的测试级别:
单元测试是在最小规模上进行测试。它测试各个功能和/或类。有许多库可用于各种不同语言的单元测试。 python的一个例子是PyUnit。
您通常通过编写大量的小范围测试来完成单元测试。例如,如果你已经编写了自己的容器类(不太可能在python中,但这是一个简单的例子),你可以进行单元测试,用于添加项目,删除项目,查找项目等。
组件测试将您的程序作为单独的组件进行测试。这通常通过创建其他组件的模拟来完成。它通常也是通过使用单元测试库来完成的,只需要进行更大的测试。如果每个类可能有10个或数百个单元测试(很大程度上取决于类的大小),那么您将对系统的每个组件进行一些组件测试。
举个例子,你提到了一个数据库。您可以通过编写返回固定数据的模拟数据库进行组件测试,并使用模拟测试与数据库连接的部件。单元测试更加困难,因为可测试性开始成为设计中的一个问题。如果将数据库硬编码到您的程序中,那么您将如何模拟数据库。尽管如此,它仍然相对容易,只需要一些预见和计划。
系统测试是最难编写测试的,因为你必须有集成点来驱动你的系统。在个人项目中,您可以跳过系统测试,特别是如果您已完成单元和组件测试的全面工作。
系统测试涉及在整个系统上完成场景。难度大大增加,尤其是对于UI应用程序,因为您必须有一种模拟用户输入的方法。使用基于文本的系统(如编译器),您只需生成文本,但使用UI时,您必须驱动输入或将测试挂钩放入输入回调中。没有任何一种尺寸适合所有解决方案,如单元测试。
真实世界测试与我进入该行业之前的测试完全不同。当我在学校的时候,我浪费了很多时间去做非生产性的事情,当我“测试”时,我觉得这些事情很有成效。话虽如此,这是我的建议:
进一步阅读:
答案 1 :(得分:0)
通过简单的谷歌搜索'烧瓶测试',第一项返回:http://flask.pocoo.org/docs/testing/
对于单元测试,我认为您可以使用一些基于文件系统的数据库,如SQLite3。
至于如何验证你的函数(如何在测试用例中编写assert),这实际上取决于你的函数在做什么。对于您的具体情况,我认为您至少需要两个测试用例:一个用于存储了列表注释的用户,另一个用于未知用户,预计不会返回任何注释。
您可以先阅读一些有关如何编写单元测试的在线指南,例如this