Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们从哪里开始使用单元测试?_Java_Jakarta Ee_Junit - Fatal编程技术网

Java 我们从哪里开始使用单元测试?

Java 我们从哪里开始使用单元测试?,java,jakarta-ee,junit,Java,Jakarta Ee,Junit,我们从哪里开始使用单元测试? 我对从哪里开始使用单元测试有一些疑问。 我在RAD中使用Junit进行单元测试。我是在所有代码都准备好部署或者可能在部署之后才这样做的。我不明白为什么我们在代码几乎准备好部署之后才进行单元测试。 我的问题是我们应该什么时候开始单元测试 我还有一些问题。。。。。 我在单元测试中所做的是从一个类中提取一个方法,并为该方法创建一个测试类。 在该类中,我为该方法提供了一些输入值,并期望从数据库获得受尊重的输出值。 现在,单个测试类执行以下操作:获取输入值->将其传递给方法-

我们从哪里开始使用单元测试? 我对从哪里开始使用单元测试有一些疑问。 我在RAD中使用Junit进行单元测试。我是在所有代码都准备好部署或者可能在部署之后才这样做的。我不明白为什么我们在代码几乎准备好部署之后才进行单元测试。 我的问题是我们应该什么时候开始单元测试

我还有一些问题。。。。。 我在单元测试中所做的是从一个类中提取一个方法,并为该方法创建一个测试类。 在该类中,我为该方法提供了一些输入值,并期望从数据库获得受尊重的输出值。 现在,单个测试类执行以下操作:获取输入值->将其传递给方法->从原始类调用方法->数据库连接->从DB获取值->将其返回到测试类

若测试成功运行,Junit控制台将显示绿色条,否则显示红色条。 带有错误原因的红色条。但它不会生成任何单元测试报告

现在我的问题是。。。
我在做正确的单元测试吗?由于单个单元测试方法包含所有代码流并给出结果…

您应该尽早编写测试,最好是在编写实现之前

这是一本我发现在这方面很有用的书,可能值得一读。。。

为了尝试解决第二点,您描述的是一个集成测试,即它不仅测试您的代码单元,还测试您的数据库连接性、配置、数据等

单元测试应该只测试您关心的代码的特定部分。i、 调用你的方法应该只是测试这个方法。它不应该涉及数据库连接和数据访问。您可以使用模拟对象作为依赖项的临时替换来实现这一点

见:

虽然本文档来自Microsoft,您使用的是java,但同样的原则也适用


希望这能有所帮助。

如果您还没有开始单元测试,那么现在是开始单元测试的最佳时间。单元测试最有效的用途是测试驱动的开发TDD,在这种开发TDD中,您在实现每个方法时为每个方法编写测试—编写一个失败的测试,然后实现该方法以使其通过。然而,现在添加测试还不算晚。JUnit测试巩固了关于代码的某些假设,这些假设以后可能会更改。如果假设发生变化,测试就会中断,您可能会从一些很难检测到的bug中解脱出来

我不知道有什么报表工具,但是您可以添加一个JUnit ANT任务,如果捕获了ANT输出,它将把测试结果输出到构建控制台或日志中

您的数据库测试听起来像小型集成测试,而不是单元测试。这很好,但是如果测试太慢,你可能想考虑通过像JMOCK或EasyMoCK这样的框架来使用模拟对象来代替真实的DB连接。这将方法的逻辑与数据库的状态和行为隔离开来,并允许您运行测试,而不必担心数据库是否正在运行并存储测试数据

有用链接:

单元可测试代码编写指南

[编辑-回应评论]: 关于您所做的是否是正确的单元测试,技术上的答案是“否”。正如我所说,它更像是一个集成测试,这很好,但它做的太多,依赖性太多,不能被视为真正的单元测试。理想情况下,单元测试将测试方法中的逻辑,而不是依赖项。上面提到的编写可测试代码的指南以及Misko Hevery的相关博客提供了一些很好的建议,说明了如何编写带有接缝的代码来插入依赖项的模拟。迈克尔·费格斯在他的优秀著作中深入探讨了这个问题


关键因素是依赖项注入:可测试方法不寻找它们的依赖项——它们在构造函数中或作为参数接收它们。如果这需要太多重构,可以尝试一些技巧,例如将查找依赖项的代码移动到可以覆盖的受保护或包可见方法中。然后在一个子类上运行测试,该子类从这些方法返回模拟对象

您应该尽早开发单元测试。事实上,最好的解决方案是在实现要测试的类之前开发它们。然后,每次向类中添加重要功能时,都要运行它们

顾名思义,单元测试用于测试操作单元。你不应该让一个测试执行太多。此外,单元测试应该是从单个类测试功能


您在这里描述的内容更像是系统测试。这是一件好事,但与单元测试完全不同。

进行认证开发需要遵循定义的开发模型。最常用的模型是V 简单地说,模型定义了需求、规范、子规范,例如组件、模块或单元等的规范。在V的左分支上自上而下。当规范定义了一个无法合理分解为更小部分的原子单元时,您最终到达V的底部

在V模型的右侧分支上,您可以验证所开发的模块是否符合其规格和/或要求。通常用于并行创建测试,或者在实现测试中的UUT单元之前创建测试。 通过这种方式,您可以测量任何模块从一开始就适合其框架,甚至在进行一些返工时

正如其他人所说,尽可能使用mock等工具使测试尽可能简单。您还应该自动化您的测试,至少是那些与驻留在V底部附近的模块相关的测试,因为这些测试通常比位于V顶部附近的测试运行得更频繁


当您的测试具有定义良好的输出时,执行适当的报告会容易得多。我们通常有一个结构的枚举通过,失败,错误,状态号和消息文本

在我看来,测试应该从你写完第一个方法的那一刻开始

编写方法时对其进行测试有很多帮助。首先,当出现问题时,你唯一的线索就是它在一个特定的类中,如果这个类有无数的方法和属性,那么很难找出是什么出了问题。显然,如果你有语法错误的话就不会了,但是当你投入一百万个方法时,语义错误会变得非常棘手

确保每个单独的方法都能工作,这是最细粒度的保证,充分说明了整个类的稳定性。如果您对特定方法应该做什么有一个具体的定义,那么单元测试不仅可以防止边缘案例语义错误,还可以帮助您事先规划程序流程,这可以帮助您避免大规模重构,或者更糟的是,重写

为了进行有效的测试,请确保将类分解为尽可能多的方法。我知道有些人可能不同意这一点,但在远离函数其余部分的上下文中执行操作的逻辑的重要部分应该转移到它们自己的函数中,以便可以独立测试。我不会在您的单元测试中执行SQL查询。相反,使用模拟对象来模拟数据库。测试数据库不是单元测试

这不仅有助于确保应用程序的完整性,而且在将来需要重构类的某些部分时也会对您有所帮助。在100行函数中寻找三行逻辑是没有意义的。如果逻辑的这些部分在它们自己的方法中,您可以放心,您的方法不会因为该逻辑而失败。如果某个函数的怪物失败了,那么关于该函数的哪个部分实际导致了错误的线索就会更少

我知道这一切听起来可能有些多余,但我的观点是,尽早进行测试,经常进行测试不仅有助于程序的稳定性,而且有助于编写干净的代码,避免查找小错误的麻烦

我的问题是我们什么时候应该去 开始单元测试

不是在所有代码都准备好部署之后。部署后不会。那太晚了。正如许多其他人所建议的,最好的时间是在编写TDD风格的代码之前

现在我的问题是。。。我在做什么 正确的单元测试?自从单身以来 单元测试方法包括所有代码 流程并给出结果

您没有进行正确的单元测试。您正在测试的单元是类方法,但它也在测试数据库连接,这通常会使测试速度太慢,无法像我们希望的那样频繁运行,而且很脆弱。这并不是说你的测试是无用的——它们可能很有用——它们只是不好的单元测试


假设您的数据库中有正确的数据,并且您的程序与它有可靠的连接。在测试过程中,您的方法将从数据库中获得什么值?只需直接输入该值,即可测试此方法的功能。因此,即使没有数据库,它也可以运行。那是什么?你的方法不是那样的吗?也许它做得太多了。可能是a从数据库中获取数据,b进行计算。也许你真的想测试一下b,我想你是的。所以把a和b分开,按照Michael Feathers的术语给自己一个接缝,在这个接缝处可以从测试方法中注入测试数据。你现在有什么?更好的设计。每种方法只做一件事。松耦合。你到那里是因为你的测试把你带到了那里。这是测试驱动的开发。

每次进行更改或编写新代码时,都应该为每个输入组合包含测试。编写代码是永无止境的,有些人,有时不得不回来进行修复或增强,而您的测试将帮助他们知道这一点
他们制作的es没有破坏任何东西。

第一个问题得到了答案?。谢谢,但第二个问题仍然有一些疑问。我的输入数据是我在测试类中读取的第一层XML文件,然后将其传递给BusinessProcess类,其中创建一个具有不同属性格式的新XML文件,并最终传递给OTM系统。因为ChrisV调用您的方法应该只测试该方法。它不应该涉及数据库连接和数据访问。您可以使用模拟对象作为依赖项的临时替换来实现这一点。既然所有方法流都是相互依赖的,那么请告诉我如何在代码中实现它。第一个问题得到答案了吗?谢谢,但第二个问题仍然有一些疑问。我的输入数据是我在测试类中读取的第一层XML文件,然后传递它要在何处构建Process类,请创建一个具有不同属性格式的新XML文件,并最终将其传递给OTM系统。既然所有方法流都是相互依赖的,请告诉我如何为代码实现模拟对象。第一个问题得到了答案?谢谢,但第二个问题仍有一些疑问。我的输入数据是我现在使用的第一层XML文件读入测试类,然后将其传递给BusinessProcess类,在该类中创建一个具有不同属性格式的新XML文件,最后将其传递给OTM系统。正如您所说,自动化您的测试,至少与位于V底部的模块相关的测试,因为这些测试通常比接近顶部的测试运行得更频繁。如果没有错误,DB部件单元测试我可以自动化吗?我可以在我的测试类中调用这些自动化测试吗。。。