尽管大多数开发人员都知道测试的重要性,但似乎他们中的很多人仍然没有进行足够的测试。如果他们编写测试,他们只是测试错误。
1.单元测试
如果某些测试是在应用程序中编写的,那么其中大部分将是单元测试。只需调用所有实用程序方法、传递一些值并检查是否
返回预期结果,即可轻松测试实用程序类。第一个错误就出现在这里。大多数人没有开箱即用,或者还不够。您可以测试1 + 1=2、2+ 1=3和3+ 1=4。但
几乎相同的测试进行3次有什么好处呢?最好测试边界情况。sum() 方法的参数是原始类型还是对象?如果它们是对象,如果传递空值会发生什么?如果抛出异常,那是预期的异常吗?它是否清楚地说明了问题所在?
2.模拟
例如,如果对服务层进行了单元测试,则应模拟所有其他组件(如DAO层)。在许多情况下,这是手动完成的。这是第二个错误。通过手动模拟东西,您的模拟与实现紧密耦合。使用模拟框架要好得多。它们是为它而生的。只要相信他们会按照您想要的方式创建模拟。一些模拟框架能够比其他框架做得更多,有些则比其他框架更容易使用。我最喜欢的模拟框架是 Mockito,因为它的强大和简单。EasyMock 是迄今为止最著名的,但 imo 使用起来有点复杂。又是什么顺序?期待、重播、断言还是……?
所以这不仅仅是选择一个模拟框架的问题。这也是一个选择正确的问题。
3.集成测试
集成测试是对应用程序不同集成部分的测试,而单元测试仅测试 LUW(逻辑工作单元)。最著名的集成测试类型是 DAO 层的测试。在这些测试中,验证了多项内容:输入参数、ORM 工具的使用、生成的查询的正确性(功能性)、是否可以访问数据库、查询正在运行的事实以及正确的事实返回结果集。
往往是做的是,开发商在DbUnit的XML数据集提供的测试数据。大多数情况下,这些数据不代表实时数据。处理这个问题的最好方法是让职能人员提供和维护这些测试数据。因为您不想让他们为特定的 XML 格式而烦恼,所以使用 XlsDataSet 格式是一个很好的做法。可以在 Excel 工作表中提供数据。选项卡的名称是表,在第一行,每列包含列的名称,在所有其他行中,添加有效数据。插入到数据库中将按每个选项卡从左到右完成。删除则相反。
4.功能测试
功能测试经常被遗忘,因为人们认为它们难以维护且成本高昂。确实,您必须调整它们以使其可维护,但是一遍又一遍地手动执行所有相同的测试将花费更多。此外,当通过持续集成的方式测试和自动化功能时,没有必要为下一个版本中将被破坏的屏幕/功能带来压力。
Selenium 是一个很棒的框架,能够在浏览器中记录功能。
大多数人只会按照他们的方式记录和重放测试。Selenium 通过 HTML id 跟踪 HTML 组件。如果您没有在 HTML 代码中指定 id,则在页面更新时它们可以轻松更改。即使功能仍然有效,这也会立即中断测试。
5.是由刚刚粘贴记录的测试在JUnit测试做。
常见的功能,如登录和注销、等待响应的时间……应该添加到更高的级别。例如,可以在每次测试之前进行登录,然后进行注销。这样,如果登录或注销功能发生变化,测试就不会中断。
6.是不存在测试逻辑流。
错误六:插入、搜索、更新和删除完全有可能独立工作,但从创建、搜索、更新到删除同一条目的完整流程将不起作用。TestSuites 是将多个测试分组并按顺序运行它们的好方法。
7.开发板
大多数测试是技术测试而不是功能测试。测试逻辑行为比测试事物在技术上是否有效要重要得多。这可以通过行为驱动设计来完成。