我知道一般来说单元测试的目的是什么,但我发现了一些困扰我的事情。
1) 测试早期发现bug的目的。因此,在后来的一些迭代中,如果我对代码进行一些更改,自动化测试必须让我惊慌失措并告诉我,我已经搞砸了很久以前被遗忘的软件。
但是,假设我有A类并且说它与其他类的实例交互,称之为B类。
当一个人为A级写单元测试时,他必须模拟B类。 因此,在某些未来,如果一个人在B类中做出一些改变,并且会导致一些错误,那么它们只会反映在B类的单元测试中,而不会反映在A中(因为A的测试不使用真正的B类,但是它是模拟的固定输入和输出)。 所以,我看不出单元测试怎么能及早通知一些人不知道的错误?我知道课堂上可能存在的错误,我正在改变,我不需要对它进行单元测试,我需要测试来警告我的变化后果,这些错误会导致一些“被遗忘”的类中的错误,而这不是单元测试可能。或者我错了吗?
2) 在编写模拟和调用方法,输入和返回值的正确期望时,必须知道将如何实现测试类。 我认为这与测试驱动的开发相矛盾。在TDD中,首先编写测试,然后由它们驱动,编写代码。 但除非我编写必须进行测试的代码,否则我无法写出正确的期望(以及一般的测试)。这与TDD相矛盾,对吧?
如果我使用真实物体而不是嘲笑,那么这两个问题都可以解决。但那不是单元测试,对吗?在单元测试中,测试类必须与系统的其余部分隔离,而不是使用真实的类而是模拟。
我确定我在某处错了,但我无法找到。我一直在阅读和阅读,我找不到我理解错误的东西。
答案 0 :(得分:5)
严格来说,您花费更多时间编写单元测试而不是专注于实际代码。
您无法实现100%的代码覆盖率。我做单元测试我的应用程序,但我觉得它不值得。但不是每个人都同意它。
如果你更改了一段代码,你的单元测试就会失败,并找出它失败的原因,但对我来说它不值得。
我不是单元测试的忠实粉丝......你嘲笑一切,但嘲笑是一项重大任务..........
但现在公司正在尝试TDD方法。
答案 1 :(得分:4)
我刚刚首次实施了TDD和单元测试。我认为它很棒,我从未在连续的集成环境中使用它,我认为它更有价值。
我的流程:
我现在不能在没有先写测试的情况下编写代码,它确实有助于开发。您可以立即捕获错误,它确实可以帮助您以结构化的简单方式对您的代码和开发进行心理订购。当然,任何破坏现有功能的代码都会立即被捕获。
我还不需要使用模拟对象(使用spring我可以直接调用服务层和控制器方法)。
答案 2 :(得分:3)
简单回答:是的,它们对真实有用。
TDD在理论上很好,但我几乎没见过它在实践中看到过。但是,单位测试不受tdd的约束。您始终可以为代码编写单元测试,以确保它在更改后仍然有效。单元测试的这种用法为我节省了无数小时的错误修正,因为测试立即指出出了什么问题。我倾向于避免嘲笑。在大多数情况下,我认为它们不值得。不使用模拟可能会使我的单元测试更多地进行集成测试,但它可以完成工作。为了确保您的课程按设计工作。
答案 3 :(得分:1)
0)不,它没有。听起来很愚蠢,我的意思是。这是一个非常有效的问题。
可悲的事实是,我们的行业充满了银色的子弹和蛇油的光滑,如果事情没有意义那么你就是对它提出质疑的。任何技术,任何工程任何部分的方法只适用于某些情况。这些通常都记录不清,所以这一切都会变得毫无意义,因为我的方法比你的方法更好。
我在单元测试中取得了成功和失败,根据我的经验,如果正确应用,它确实非常有用。
当您进行大规模的从头开发工作时,这不是一项好技术,因为一切都在变化太快,以至于单元测试无法跟上。在维护阶段,这是一种很好的技术,因为你正在改变一个较大整体的一小部分,它仍然需要以预期的方式工作。
对我而言,单元测试不是测试驱动开发,而是按合同设计:单元测试检查接口是否未被违反。从这一点来看,很容易看出同一个人不应该写一个单元及其相应的单元测试,所以对于非常小规模的东西,比如我自己的宠物项目,我从不使用它。在大型项目中,我提倡 - 但只有在采用合同设计并且项目将接口规范视为重要文物时才会提倡。
作为一种技术的单元测试对单元尺寸也很敏感。不一定是一个类本身是可测试的,根据我的经验,该类通常对于单元测试来说太小了。您不希望测试类本身,您想要测试一个功能单元。可单独部署(可安装)的二进制文件(例如jar或DLL)可以在我的书中提供更好的候选者,如果你使用的是Java风格的语言,则可以成为更好的候选者。
答案 4 :(得分:1)
单元测试本身并不愚蠢,这取决于您的项目。
我认为单元测试很好,不仅仅是在TDD开发中,而是在任何类型的项目中。对我来说,真正的专业是,如果你使用单元测试将关键代码包装在你的项目中,那么有一种方法可以知道你的意思是否仍在使用。
对我来说,真正的问题是,如果有人弄乱你的代码,他/她应该有办法知道测试是否仍在继续,但不能让他们手动运行。例如,让我们以Eclipse + Java + Maven为例。如果您在Maven Java项目中使用单元测试,则每次构建它时,测试都会自动运行。所以,如果有人搞砸了你的代码,下次他构建它时,他会得到一个“BUILD FAILED”控制台错误,指出某些单元测试失败。
所以我的观点是:单元测试很好,但是人们应该知道他们在每次更改代码时都没有运行测试时搞砸了。