JUnit 面试问题(JUnit Interview Questions)
亲爱的读者,这些JUnit Interview Questions专门设计用于让您了解在面试JUnit期间可能遇到的问题的性质。 根据我的经验,好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的内容:
测试是检查应用程序功能是否符合要求的过程。
单元测试是单个实体(类或方法)的测试。 单元测试对于每个软件公司来说都非常重要,可以为客户提供优质产品。
在没有任何工具支持的情况下手动执行测试用例称为手动测试。
使用自动化工具获取工具支持并执行测试用例称为自动化测试。
以下是手动测试的缺点 -
耗时且乏味 - 由于测试用例由人力资源执行,因此非常缓慢而乏味。
巨大的人力资源投入 - 由于测试用例需要手动执行,因此手动测试需要更多的测试人员。
不太可靠 - 手动测试不太可靠,因为由于人为错误,每次测试可能无法精确执行。
不可编程 - 无法编写程序来编写获取隐藏信息的复杂测试。
以下是自动化测试的优势 -
Fast - 自动化运行测试用例的速度明显快于人力资源。
Less investment in human resources - 使用自动化工具执行测试用例,因此自动化测试中需要的测试人员较少。
More reliable - 自动化测试每次运行时都执行完全相同的操作。
Programmable - 测试人员可以Programmable复杂的测试来显示隐藏的信息。
JUnit是一个回归测试框架,开发人员使用它来实现Java中的单元测试,加快编程速度并提高代码质量。
以下是JUnit的重要功能 -
它是一个开源框架。
提供注释以标识测试方法。
提供断言以测试预期结果。
提供用于运行测试的测试运行器。
JUnit测试可以自动运行,并检查自己的结果并提供即时反馈。
JUnit测试可以组织到包含测试用例甚至其他测试套件的测试套件中。
如果测试正常,JUnit会在条形图中显示绿色测试进度,当测试失败时它会变为红色。
单元测试用例是代码的一部分,它确保代码(方法)的另一部分按预期工作。 为了快速实现这些预期的结果,需要测试框架.JUnit是java编程语言的完美单元测试框架。
正式的书面单元测试用例的特征在于已知输入和预期输出,其在测试执行之前得出。 已知输入应测试前提条件,预期输出应测试后置条件。
每个要求必须至少有两个单元测试用例:一个是阳性测试,一个是阴性测试。 如果需求具有子需求,则每个子需求必须至少有两个测试用例为正面和负面。
在开发过程中,代码会在代码之前编写,以帮助编码人员编写最佳代码。
使用system.out.println()调试代码将导致每次运行程序时手动扫描整个输出,以确保代码执行预期的操作。 而且,从长远来看,编写JUnit方法并在类文件上测试它们需要更少的时间。
请按照以下步骤操作 -
下载最新版本的JUnit,以下称为junit.zip。
将junit.zip分发文件解压缩到称为%JUNIT_HOME%的目录。
将JUnit添加到类路径 -
set CLASSPATH=%CLASSPATH%;%JUNIT_HOME%\junit.jar
通过运行随JUnit一起分发的样本测试来测试安装(样本测试直接位于安装目录中,而不是junit.jar文件)。 然后只需输入 -
java org.junit.runner.JUnitCore org.junit.tests.AllTests
所有测试都应该传递“OK”消息。 如果测试未通过,请验证junit.jar是否在CLASSPATH中。
在单个测试中报告多个故障通常表明测试过多而且单元测试太大。 JUnit旨在通过许多小测试最好地工作。 它在测试类的单独实例中执行每个测试。 它报告每次测试失败。
JUnit 3.7弃用了assert()并将其替换为assertTrue(),它的工作方式完全相同。 JUnit 4与assert关键字兼容。 如果使用-ea JVM开关运行,则JUnit将报告失败的断言。
重构J2EE组件以将功能委托给不必在J2EE容器中运行的其他对象将改进软件的设计和可测试性。 Cactus是一个开源JUnit扩展,可用于单元测试服务器端Java代码。
JUnit Framework可以轻松地与以下任何一个集成 -
- Eclipse
- Ant
- Maven
JUnit测试框架提供以下重要功能 -
- Fixtures
- 测试套件
- 测试跑步者
- JUnit类
Fixture是一组对象的固定状态,用作运行测试的基线。 测试夹具的目的是确保存在一个众所周知且固定的环境,在该环境中运行测试以使结果可重复。 它包括以下方法 -
setUp()方法,在每次测试调用之前运行。
tearDown()方法,在每个测试方法之后运行。
测试套件意味着捆绑几个单元测试用例并一起运行。 在JUnit中,@ RunWith和@Suite注释都用于运行套件测试。
测试运行器用于执行测试用例。
JUnit类是用于编写和测试JUnit的重要类。 一些重要的课程是 -
Assert - 它包含一组断言方法。
TestCase - 它包含一个测试用例,定义了用于运行多个测试的fixture。
TestResult - 它包含收集执行测试用例结果的方法。
TestSuite - 它是测试的综合。
注释就像元标记,您可以将其添加到代码中并将它们应用于方法或类中。 JUnit中的注释为我们提供了有关测试方法的信息,这些方法将在测试方法之前和之后运行,哪些方法在所有方法之前和之后运行,哪些方法或类在执行期间将被忽略。
请按照以下步骤操作 -
设置CLASSPATH
调用跑步者 -
java org.junit.runner.JUnitCore
该类提供了一组用于编写测试的断言方法。 仅记录失败的断言。
TestResult收集执行测试用例的结果。 它是收集参数模式的一个实例。 测试框架区分故障和错误。 预计会出现故障并通过断言进行检查。 错误是像ArrayIndexOutOfBoundsException这样的意外问题。
TestSuite是测试的综合体。 它运行一组测试用例。
Test annotation告诉JUnit它所附加的public void方法可以作为测试用例运行。
几个测试需要在它们运行之前创建类似的对象。 使用@Before注释public void方法会导致该方法在每个Test方法之前运行。
如果在Before方法中分配外部资源,则需要在测试运行后释放它们。 使用@After注释public void方法会导致该方法在Test方法之后运行。
使用@BeforeClass注释公共静态void方法会导致它在类中的任何测试方法之前运行一次。
这将在所有测试完成后执行该方法。 这可用于执行清理活动。
以下是@Ignore注释的一些用处 -
您可以轻松识别源代码中的所有@Ignore注释,而未注释或注释掉的测试并不是那么容易找到。
有些情况下,您无法修复失败的代码,但您仍然希望方法可以解决,确切地说它不会被遗忘。 在这种情况下@Ignore是有道理的。
以下是JUnit执行过程的工作原理 -
首先注释为@BeforeClass的方法只执行一次。
最后,注释为@AfterClass的方法只执行一次。
注释为@Before的方法为每个测试用例执行但在执行测试用例之前。
注释为@After的方法为每个测试用例执行但在执行测试用例之后。
在注释为@Before的方法和注释为@After的方法之间执行每个测试用例。
测试用例使用JUnitCore类执行。 JUnitCore是运行测试的外观。 它支持运行JUnit 4测试,JUnit 3.8.x测试和混合。
Junit提供了一个方便的Timeout选项。 如果测试用例花费的时间超过指定的毫秒数,那么Junit会自动将其标记为失败。 timeout参数与@Test注释一起使用。
JUnit提供了跟踪代码的异常处理的选项。 您可以测试代码是否抛出所需的异常。 预期参数与@Test注释一起使用,如下所示 - @Test(expected)
Junit 4推出了一项新功能参数化测试。 参数化测试允许开发人员使用不同的值反复运行相同的测试。
创建参数化测试需要遵循五个步骤 -
使用@RunWith(Parameterized.class)注释测试类。
创建一个使用@Parameters注释的公共静态方法,该方法返回一个对象集合(作为数组)作为测试数据集。
创建一个公共构造函数,它接受相当于一行“测试数据”的内容。
为测试数据的每个“列”创建一个实例变量。
使用实例变量作为测试数据的来源创建测试用例。
每行数据将调用一次测试用例。 让我们看看参数化测试的实际效果。
Fixtures是一组对象的固定状态,用作运行测试的基线。 测试夹具的目的是确保存在一个众所周知且固定的环境,在该环境中运行测试以使结果可重复。 它包括 -
setUp()方法,在每次测试调用之前运行。
tearDown()方法,在每个测试方法之后运行。
编译JUnit测试类就像编译任何其他Java类一样。 您需要注意的唯一事情是JUnit JAR文件必须包含在类路径中。
如果将JUnit测试方法声明为“private”,则会成功编译。 但执行将失败。 这是因为JUnit要求必须将所有测试方法声明为“public”。
当方法声明为“protected”时,只能在定义类的同一个包中访问它。 因此,要测试目标类的“受保护”方法,请在与目标类相同的包中定义测试类。
当方法声明为“私有”时,它只能在同一个类中访问。 因此,无法从任何测试类测试目标类的“私有”方法。 因此,您需要手动执行单元测试。 或者你必须将你的方法从“私人”改为“受保护”。
如果声明JUnit测试方法返回“String”,则编译将通过ok。 但执行将失败。 这是因为JUnit要求必须声明所有测试方法都返回“void”。
是的,您可以使用main()方法进行测试。 一个明显的优势似乎是你可以对这个类进行白盒测试。 也就是说,您可以测试它的内部(例如私有方法)。 你不能用单元测试来做到这一点。 但主要是测试框架从用户的角度测试接口和行为。
不。我们不需要为每个需要测试的类编写独立的测试类。 如果有一小组测试共享一个共同的测试夹具,您可以将这些测试移动到新的测试类。
测试运行器在测试执行期间持有对所有Test实例的强引用。 这意味着对于具有许多Test实例的非常长的测试运行,在整个测试运行结束之前,所有测试都不会被垃圾收集。 例如,在tearDown()方法中将对象显式设置为null,允许在整个测试运行结束之前对其进行垃圾回收。
在单元测试中,模拟对象可以模拟复杂的,真实的(非模拟)对象的行为,因此当真实对象不可行或不可能合并到单元测试中时非常有用。
使用模拟对象进行测试的常见编码风格是 -
- 创建模拟对象的实例。
- 在模拟对象中设置状态和期望。
- 使用模拟对象作为参数调用域代码。
- 验证模拟对象的一致性。
以下是JUnit扩展 -
Cactus
JWebUnit
XMLUnit
MockObject
Cactus是一个简单的测试框架,用于测试服务器端Java代码(Servlet,EJB,Tag Libs,Filters)。 Cactus的目的是降低为服务器端代码编写测试的成本。 它使用JUnit并扩展它。 Cactus实现了容器内策略,这意味着测试在容器内执行。
仙人掌生态系统由几个组成部分组成 -
仙人掌框架是仙人掌的核心。 它是提供API来编写Cactus测试的引擎。
Cactus Integration Modules是前端和框架,提供了使用Cactus Framework(Ant脚本,Eclipse插件,Maven插件)的简便方法。
WebUnit是一个基于Java的Web应用程序测试框架。 它使用统一,简单的测试界面包装现有的测试框架(如HtmlUnit和Selenium),以便您快速测试Web应用程序的正确性。
JWebUnit提供了一个高级Java API,用于导航Web应用程序并结合一组断言来验证应用程序的正确性。 这包括通过链接导航,表单输入和提交,表格内容验证以及其他典型的商业Web应用程序功能。
与仅使用JUnit或HtmlUnit相比,简单的导航方法和即用型断言允许更快速地创建测试。 如果你想从HtmlUnit切换到其他插件,如Selenium(即将推出),则无需重写测试。
XMLUnit提供单个JUnit扩展类,XMLTestCase和一组支持类。
支持类允许对以下内容进行断言:
两段XML之间的差异(通过Diff和DetailedDiff类)。
一段XML的有效性(通过Validator类)。
使用XSLT(通过Transform类)转换XML片段的结果。
在一段XML上评估XPath表达式(通过实现XpathEngine接口的类)。
DOM Traversal(通过NodeTest类)公开的XML片段中的各个节点。
接下来是什么? (What is Next ?)
此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。