如何开始对大型应用程序进行自动化测试?

4

编辑:感谢友好的评论者,我了解了单元测试和自动化测试之间的区别,因此我更改了主题名称。

环境:.net 2.0,sql server 2005,windows server 2003

我看了这篇文章:

http://www.codeproject.com/KB/tips/convince.aspx

这个人在讲如何在不改变一切的情况下为现有应用程序添加自动化测试。

我不得不说,这篇文章真的很棒,让我想试试!

所以我们的系统几乎相同:所有数据都可以通过 Web 服务访问,因此我们可以轻松地(例如使用 soapui)针对这些 Web 服务进行一些自动化测试。

但是:数据库怎么办?为了进行自动化测试,我们需要在数据库中拥有与自动化测试相对应的正确数据。

例如,如果我想要执行一个自动化测试,检查软件是否会在客户姓名为空时引发错误,那么我需要在我的数据库中添加一个空姓名的客户。

以下是我认为我可以做到的:

  • 创建一个服务器,包含所有必需的组件(iis、sql server 等)
  • 添加一些内容,使得该服务器的日期永远不会更改,以便我不必在自动化测试中更改时间
  • 在我的数据库中添加所需的记录,以进行自动化测试

问题是:经过 10 次自动化测试后,数据库将变成一团糟,并且我永远不知道每个记录用于哪个自动化测试。 想法是在每个表中添加“TEST_NAME”列,但在我看来有点不好。

因此,您是否尝试过这种技术?使用了某些特定的工具吗?我的思考方式是否正确?(或者至少是一个好方法)。

谢谢

编辑:我为这个主题得到了两个 -1,我想知道为什么,这样我就不会再犯同样的错误了。


2
你想要进行更多的单元测试(使用 Mocks 和 Fakes 代替真实数据库),而不是那些会因为依赖于特定环境和真实数据库中的记录而经常出错的系统级测试。这对你来说可能会更具挑战性,因为你在开发之前没有编写测试。Michael Feathers 的书《与遗留代码有效地工作》可以帮助你应对这种情况。 - Chris O
5
@remi - 你可能考虑将“单元测试”改为“自动化测试”。 单元测试与外部资源(如数据库、文件系统和网络)隔离。 - Jeff Sternal
@Jeff:在这里,我只想测试我的业务层(即Web服务),而不是我的数据库,但我必须向我的数据库添加测试数据才能使其正常工作。 @Chris O:正如Omar在文章中所说,这里的目标是只编写单元测试,我们的代码尚未准备好进行模拟(开发人员也是如此),因此我认为我们必须使用我们的数据库。 - remi bourgarel
@Remi,你会发现通过修复破损的环境和暂存数据库来支持系统测试比学习如何模拟更加痛苦。这是我的经验。 - Chris O
我同意上面评论者的观点。如果你想要将你的集成测试提升到更高的水平,那就询问如何进行更好的集成测试。询问如何在单元测试中改进数据库处理方式会让人觉得你还不理解什么是单元测试。 - MatthewMartin
我其实不太清楚单元测试是什么,我只是读了这篇文章:我需要自动化测试来节省时间,同时也方便 QA 团队。Mock 真的是个好主意,但是我的同事可能不理解为什么参数中有一个接口,为什么我不能直接调用我们的静态类来获取数据……我认为这是一个重要的标准。 - remi bourgarel
3个回答

2
如果您的单元测试涉及到持久层,那么实际上您可能正在进行类似于集成测试的操作。您应该在单元测试期间将数据库抽象出来,以便仅测试逻辑而不是实际的持久性介质。这使您可以专注于业务层逻辑。但要做到这一点并不容易,因为它取决于您的数据层架构。
数据层通常只是一个推入和拉出的简单问题,因此假设您可以将数据层抽象为一个接口,如下所示:
interface IRepository
{
   GetModel(id);
   SaveModel(model);
}

在你的单元测试中,你可以使用这个接口来模拟你的数据层。这样,你就可以告诉数据库的存根返回任何你想要的值,并编写一个测试来验证当发生该情况时所期望的行为。


我觉得我并没有完全理解单元测试的意义(尽管我已经读了很多关于它的内容,但是在实际情况下我才真正明白)。因此,我稍微改变了话题。谢谢。 - remi bourgarel

0

可能有比我正在考虑的更好的解决方案,但为什么不使用不同的数据库进行单元测试,并清除所有内容以准备另一个测试周期。


这就是我正在思考的问题:如何管理这个数据库,以及如何确定哪个单元测试与记录相关联。 - remi bourgarel
每个自动测试都有不同的基于文件的数据集。我以前使用过dbUnit。在每个测试开始时,销毁所有内容,然后仅构建所需的数据集。http://www.dbunit.org/bestpractices.html#nocleanup 编辑:将“单元”更改为“自动化”。就个人而言,我认为您进行的是“功能”或“集成”测试,而非“单元测试”(它们也需要完成,所以不要感到难过)。 - Michael Lloyd Lee mlk
使用另一个数据库进行测试仍然是集成测试。单元测试的回报在于当您的测试摆脱了对数据库的依赖时。 - MatthewMartin

0
如果您可以在每批测试之前生成测试数据,则让您的记录从一个等于下一个可被100整除的数字的ID开始。因此,如果最大记录为350,则从400开始生成并测试400及以上。当您的数据库变得非常大时,请删除所有内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接