我想问一下在Web开发中使用单元测试。单元测试的想法很棒,但是它确实在Web应用程序的上下文中带来了价值吗?我的问题的第二部分是关于TDD。如果在实际代码之前创建集成测试,这种方法可以称为“测试驱动开发”吗?
1。假设
通过定义单元测试应该只在一个服务层上测试代码。如果测试跨多个层测试代码,我们就会进行集成测试。
2。参数
2.1无算法
Web应用程序中的算法并不多。这不像是建立一个3D物理引擎,每个方法都有一些挑战,难以调试。 Web应用程序主要是关于集成和生成HTML。
Web应用程序面临的最大挑战是: - 干净的代码(任何软件的普遍问题,但不可测试) - 数据一致性 - 集成(编程语言,文件系统,配置文件,Web服务器,缓存系统,数据库,搜索引擎,外部API - 所有这些系统必须根据请求协同工作)
如果要为Web应用程序中的每个类构建单元测试,您将测试(在大多数情况下):填充数组,字符串连接和语言的本机函数。
2.2费用
仅仅因为Web App完全是关于集成的,所以总是存在多个依赖关系。你必须嘲笑许多不同的类,写一个小测试可能实际上是一个很大的工作。更糟糕的是,这不仅仅是关于测试。软件需要可测试。这意味着必须能够在几乎每个类中注入依赖项。在两个类(或系统)之间创建附加层并不总是可以注入依赖项。它使代码复杂化并使其使用起来更加昂贵。
第3。整合测试
如果网络开发是关于集成的,那么为什么不测试呢?反驳论点很少。
3.1集成测试表示“某些内容已被破坏”但未说明
这真的归结为:与集成测试失败相比,在制作代码“UnitTestable”和更复杂的时间(我猜这是主观的)时,找到错误需要多长时间?根据我的经验,找到问题的根源从未花费很长时间。
3.2您可以在任何环境中运行单元测试,但很难进行集成测试
是的,如果您想在没有数据库的情况下运行集成测试。通常有一个数据库。只要你在每次测试后操作修复数据并清理,那么它应该没问题。事务数据库非常适合此任务。打开事务,插入数据,测试,回滚。
3.3集成测试很难维护
我无法对此发表评论,因为我的所有测试工作都很顺利,而且我从来没有遇到过这方面的问题。
4。创建良好的单元测试!
整个论点可以被攻击“如果你创建单元测试权利,那么你没有任何问题。”集成测试不能相同吗?如果更容易创建集成测试,为什么不坚持它并且只是做对了?
不要误会我的意思我不反对单元测试。这是完美的主意,我推荐给大家。我试图理解:它真的适合网络开发吗?我想听听你的意见和经验。
答案 0 :(得分:5)
这是一个该死的好问题,更多开发者应该问自己。
我认为这不仅适用于网站开发,但我认为这是一个很好的例子来讨论。
在决定您的测试策略时,您提出的要点非常有效。 在商业世界中,成本(就时间而言)可能是最重要的因素。 我总是遵循一些简单的规则来保持我的测试策略的真实性。
一旦你确定了这三点,考虑到你的成本限制,你可以继续以有意义的方式继续测试任何有意义的事情。
单元测试和集成测试不是互斥的,除非你正在构建一个漂亮的单元可测试库,否则你应该同时进行。
答案 1 :(得分:3)
简短的回答是肯定的。单元测试和集成测试一样有价值。 就个人而言,我不擅长做TDD,但我注意到的是它极大地改进了设计,因为我必须首先思考然后再编码。 至少对我而言,这是非常宝贵的,但它也需要很多人习惯。 我认为,这是导致它被如此广泛误解的主要原因。
让我们来看看你的观点:
没有算法(但你的意思是少数):
正如评论中所述,这取决于应用程序。这实际上与TDD无关。很少有算法不是不测试它们的论据。您可能有几个不同的情况,有很多不同的状态。知道它们按预期工作会不会很好?
<强>费用强>
当然它会花费,如果它是一个小项目,如果您或您的开发人员不熟悉TDD,您可能无法获得TDD的任何价值。然后,一个小项目可能只是开始使用它的东西,所以你可以加速下一个更大的项目。这是你必须自己做的计算。我们是程序员,而不是经济学家。
整合测试
也测试一下!
整合测试说“有些东西被打破”,但没有说明
我很抱歉,但我不明白这个。
难以维护
如果很难保持你做错了。首先编写测试,在实现之前更改测试,更改代码时。开发期间的测试失败是TDD必须的。 实际上不要引用我那个,这只是我对TDD的有限理解。
我发现this是关于单元测试的非常好的引用
单元测试应该是规定性的,而不是描述性的。换句话说,单元测试应该定义你的代码应该做什么,而不是在你的代码所做的事情之后进行说明。
归结为集成测试和单元测试是两回事。 TDD是一种开发方法,集成测试更像是从用户角度按预期工作的应用验证。
修改强> 社区wiki说这是关于集成测试的:
在集成测试中,所有输入模块都是具有的模块 已经过单元测试。这些模块分组更大 聚合和集成测试(在集成测试计划中定义) 适用于那些聚合。经过成功的集成测试, 集成系统已准备好进行系统测试。
所以实际上我对integration testing
的理解从一开始就是错误的,但我认为除了最后一段之外我的回答太过分了。
答案 2 :(得分:0)
与单元测试相比,集成测试需要更多时间来执行。
“...关于集成的所有内容总是存在多个依赖项” - &gt;如果你在一个从属单元上编码而没有完成其他单元,那么你还不能进行集成测试。如果您想确保您的代码在此时正常工作,您可以进行单元测试。
如果团队中的每个成员都在开发他们自己的依赖单元,他们还不能进行集成测试,因为所需的单元仍由其他人开发。但至少如果他们在提交到存储库之前执行单元测试,他们可以确保他们的代码正常工作。