JUnit - 面试问题



亲爱的读者,这些JUnit 面试问题专为帮助您熟悉在JUnit主题面试中可能遇到的问题类型而设计。根据我的经验,优秀的面试官在面试过程中很少会计划提出特定的问题,通常问题会从主题的一些基本概念开始,然后根据进一步的讨论以及您的回答继续进行。

测试是检查应用程序功能的过程,以确保其是否按要求工作。

单元测试是对单个实体(类或方法)的测试。单元测试对于每个软件公司来说都至关重要,以便向客户提供高质量的产品。

在没有任何工具支持的情况下手动执行测试用例称为手动测试。

借助工具支持并使用自动化工具执行测试用例称为自动化测试。

以下是手动测试的缺点:

  • 耗时且乏味 - 由于测试用例由人力资源执行,因此速度非常慢且乏味。

  • 人力资源投入巨大 - 由于需要手动执行测试用例,因此手动测试需要更多的测试人员。

  • 可靠性低 - 手动测试的可靠性较低,因为由于人为错误,每次测试的执行精度可能不一致。

  • 不可编程 - 无法进行编程以编写复杂的测试来获取隐藏的信息。

以下是自动化测试的优点:

  • 快速 - 自动化运行测试用例的速度比人力资源快得多。

  • 人力资源投入减少 - 测试用例通过使用自动化工具执行,因此自动化测试需要的测试人员较少。

  • 更可靠 - 自动化测试每次运行时都执行相同的操作。

  • 可编程 - 测试人员可以编写复杂的测试来提取隐藏的信息。

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 框架可以轻松地与以下任何一种集成:

  • Eclipse
  • Ant
  • Maven

JUnit 测试框架提供以下重要特性:

  • 夹具
  • 测试套件
  • 测试运行器
  • JUnit 类

夹具是一组对象的固定状态,用作运行测试的基线。测试夹具的目的是确保有一个众所周知且固定的环境来运行测试,以便结果可重复。它包括以下方法:

  • setUp() 方法,在每次测试调用之前运行。

  • tearDown() 方法,在每次测试方法之后运行。

测试套件表示捆绑一些单元测试用例并一起运行它们。在 JUnit 中,@RunWith 和 @Suite 注解都用于运行套件测试。

测试运行器用于执行测试用例。

JUnit 类是在编写和测试 JUnit 中使用的重要类。一些重要的类是:

  • Assert - 它包含一组断言方法。

  • TestCase - 它包含一个测试用例,定义了运行多个测试的夹具。

  • TestResult - 它包含收集执行测试用例结果的方法。

  • TestSuite - 它是测试的组合。

注解就像元标记,您可以将其添加到代码中并将其应用于方法或类。JUnit 中的注解为我们提供了有关测试方法的信息,哪些方法将在测试方法之前和之后运行,哪些方法将在所有方法之前和之后运行,哪些方法或类在执行期间将被忽略。

请按照以下步骤操作:

  • 设置 CLASSPATH

  • 调用运行器:

java org.junit.runner.JUnitCore 

此类提供了一组用于编写测试的有用断言方法。仅记录失败的断言。

TestResult 收集执行测试用例的结果。它是收集参数模式的一个实例。测试框架区分失败和错误。失败是预期的并通过断言进行检查。错误是意外的问题,例如 ArrayIndexOutOfBoundsException。

TestSuite 是测试的组合。它运行一系列测试用例。

Test 注解告诉 JUnit 附加到其上的 public void 方法可以作为测试用例运行。

一些测试在运行之前需要创建类似的对象。使用 `@Before` 注解一个公共的 `void` 方法会导致该方法在每个测试方法之前运行。

如果在 `Before` 方法中分配了外部资源,则需要在测试运行后释放它们。使用 `@After` 注解一个公共的 `void` 方法会导致该方法在测试方法之后运行。

使用 `@BeforeClass` 注解一个公共的静态 `void` 方法会导致它在类中任何测试方法之前只运行一次。

这将在所有测试完成后执行该方法。这可以用于执行清理活动。

以下是 `@Ignore` 注解的一些用途:

您可以在源代码中轻松识别所有 `@Ignore` 注解,而未加注解或已注释掉的测试则不容易找到。

在某些情况下,您可能无法修复失败的代码,但您仍然希望该方法存在,正是为了防止它被遗忘。在这种情况下,`@Ignore` 很有意义。

以下是 JUnit 执行过程的工作原理:

  • 首先,使用 `@BeforeClass` 注解的方法只执行一次。

  • 最后,使用 `@AfterClass` 注解的方法只执行一次。

  • 使用 `@Before` 注解的方法为每个测试用例执行,但在执行测试用例之前。

  • 使用 `@After` 注解的方法为每个测试用例执行,但在测试用例执行之后。

  • 在使用 `@Before` 注解的方法和使用 `@After` 注解的方法之间,每个测试用例都会执行。

测试用例使用 JUnitCore 类执行。JUnitCore 是用于运行测试的 Facade。它支持运行 JUnit 4 测试、JUnit 3.8.x 测试以及混合测试。

Junit 提供了一个方便的 Timeout 选项。如果测试用例花费的时间超过指定的毫秒数,则 Junit 会自动将其标记为失败。timeout 参数与 `@Test` 注解一起使用。

JUnit 提供了一个跟踪代码异常处理的选项。您可以测试代码是否抛出了期望的异常。expected 参数与 `@Test` 注解一起使用,如下所示:`@Test(expected)`

Junit 4 引入了一项新功能:参数化测试。参数化测试允许开发人员使用不同的值反复运行相同的测试。

创建参数化测试需要遵循五个步骤:

  • 使用 `@RunWith(Parameterized.class)` 注解测试类。

  • 创建一个使用 `@Parameters` 注解的公共静态方法,该方法返回一个对象集合(作为数组),作为测试数据集。

  • 创建一个公共构造函数,它接收相当于测试数据的一“行”。

  • 为测试数据的每一“列”创建一个实例变量。

  • 使用实例变量作为测试数据源创建测试用例。

  • 每个数据行都会调用一次测试用例。让我们看看参数化测试的实际应用。

夹具是一组对象的固定状态,用作运行测试的基线。测试夹具的目的是确保有一个众所周知且固定的环境来运行测试,以便结果可重复。它包括:

  • setUp() 方法,在每次测试调用之前运行。

  • tearDown() 方法,在每次测试方法之后运行。

编译 JUnit 测试类就像编译任何其他 Java 类一样。您需要注意的唯一一点是,JUnit JAR 文件必须包含在类路径中。

如果 JUnit 测试方法声明为“private”,则它会成功编译。但执行将失败。这是因为 JUnit 要求所有测试方法都必须声明为“public”。

当方法声明为“protected”时,只能在定义类的同一个包中访问它。因此,要测试目标类的“protected”方法,请在与目标类相同的包中定义您的测试类。

当方法声明为“private”时,只能在同一个类中访问它。因此,无法从任何测试类测试目标类的“private”方法。因此,您需要手动执行单元测试。或者您必须将方法从“private”更改为“protected”。

如果 JUnit 测试方法声明为返回“String”,则编译将通过。但执行将失败。这是因为 JUnit 要求所有测试方法都必须声明为返回“void”。

是的,您可以使用 main() 方法进行测试。一个明显的优势似乎是您可以白盒测试该类。也就是说,您可以测试它的内部(例如私有方法)。您无法使用单元测试来做到这一点。但主要的是,测试框架从用户的角度测试接口和行为。

不。我们不需要为每个需要测试的类编写一个独立的测试类。如果有一小组测试共享一个公共的测试夹具,您可以将这些测试移动到一个新的测试类中。

测试运行程序在测试执行期间会对所有 Test 实例保持强引用。这意味着对于具有许多 Test 实例的非常长的测试运行,在整个测试运行结束之前,可能没有任何测试会被垃圾回收。例如,在 tearDown() 方法中将对象显式设置为 null,允许它在整个测试运行结束之前被垃圾回收。

在单元测试中,模拟对象可以模拟复杂、真实(非模拟)对象的行为,因此当在单元测试中包含真实对象不切实际或不可能时,它们非常有用。

使用模拟对象进行测试的常用编码风格是:

  • 创建模拟对象的实例。
  • 在模拟对象中设置状态和期望。
  • 使用模拟对象作为参数调用领域代码。
  • 验证模拟对象的一致性。

以下是 JUnit 扩展:

  • Cactus

  • JWebUnit

  • XMLUnit

  • MockObject

Cactus 是一个简单的测试框架,用于单元测试服务器端 Java 代码(Servlet、EJB、标签库、过滤器)。Cactus 的目的是降低编写服务器端代码测试的成本。它使用 JUnit 并对其进行扩展。Cactus 实现了容器内策略,这意味着测试在容器内执行。

Cactus 生态系统由几个组件组成:

  • Cactus 框架是 Cactus 的核心。它是提供编写 Cactus 测试的 API 的引擎。

  • Cactus 集成模块是前端和框架,它们提供了使用 Cactus 框架的简便方法(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 转换 XML 片段的结果(通过 Transform 类)。

  • 在 XML 片段上评估 XPath 表达式(通过实现 XpathEngine 接口的类)。

  • DOM 遍历公开的 XML 片段中的单个节点(通过 NodeTest 类)。

接下来是什么?

此外,您可以回顾一下您之前完成的与该主题相关的作业,并确保您可以自信地谈论它们。如果您是应届毕业生,面试官并不期望您能回答非常复杂的问题,而是您必须使自己的基础概念非常牢固。

其次,如果您无法回答一些问题,这并不重要,重要的是您回答的任何问题都必须充满信心。所以在面试时要自信。我们在 tutorialspoint 祝您面试顺利,并祝您未来一切顺利。干杯 :-)

junit_questions_answers.htm
广告