目录

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 ?)

此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。

↑回到顶部↑
WIKI教程 @2018