Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Unit testing 单元测试-混乱_Unit Testing_Testing_Junit_Tdd_Phpunit - Fatal编程技术网

Unit testing 单元测试-混乱

Unit testing 单元测试-混乱,unit-testing,testing,junit,tdd,phpunit,Unit Testing,Testing,Junit,Tdd,Phpunit,我正在学习单元测试,对什么是测试以及测试的范围感到困惑 所以这个问题的答案很清楚—— 对我来说最突出的一点是“它与数据库对话” 在我学习的特定系统中,我需要测试xml树中的特定节点(表示为对象) 除了加载此对象之外,我如何测试此值的存在?或者我是否混淆了单元测试和功能测试?如果这只是一个单元测试,那么您正在测试读取xml树的代码,并检查该树是否符合预期。您可以通过多种方式加载测试对象。一种是让单元测试构造对象,作为测试设置的一部分。另一种方法是将xml树的测试版本存储在平面文件中(与测试类一起)

我正在学习单元测试,对什么是测试以及测试的范围感到困惑

所以这个问题的答案很清楚——

对我来说最突出的一点是“它与数据库对话”

在我学习的特定系统中,我需要测试xml树中的特定节点(表示为对象)


除了加载此对象之外,我如何测试此值的存在?或者我是否混淆了单元测试和功能测试?

如果这只是一个单元测试,那么您正在测试读取xml树的代码,并检查该树是否符合预期。您可以通过多种方式加载测试对象。一种是让单元测试构造对象,作为测试设置的一部分。另一种方法是将xml树的测试版本存储在平面文件中(与测试类一起),并让测试人员在测试时解析该文件


关键是,测试的输入需要是一个控件,而不是依赖于某些外部资源(如数据库)的状态的东西。

在我的测试中,我不仅对特定函数进行了一次测试,而且对其进行了越来越多的测试,因此单元测试是可能性的一部分。我选择特定的情况,例如在除法中,我对操作数、单个操作数等使用0,限制特定的数值间隔,但也使用正常情况。所有测试都是可预测的,所以当我更改代码时,case的执行可以确保所做更改的稳定性

在您的情况下,我认为您正在进行单个单元测试

我接受维基百科对单元测试和功能测试的定义

功能测试非常广泛,并且是面向程序的。单元测试面向可测试代码的最小部分,并且应该尽可能具有通用性

在您的特定案例中,“在我正在学习的特定系统中,我需要测试xml树中的特定节点-表示为对象”,如果函数的结果是对象,您应该定义一个众所周知的输入字符串、文件、静态对象,以及断言特定输入的输出是具有特定节点的对象,或者更好地提取返回对象,提取特定节点并断言特定节点应等于特定值/对象


我希望对你有用你链接到的答案的要点是

单元测试不应依赖于外部资源

因此,只要您的XML树是通过编程方式创建的,并且只存储在内存中,而不是从文件系统(或任何其他外部资源)加载的,那么您就做得对了

以编程方式创建XML树可能会很麻烦,因此您可以做的是将树作为XML文件存储在与测试相同的包中,然后使用

this.getClass().getClassLoader().getResourcesAsStream(name);

它不算作外部资源,因为它是从测试套件的类路径加载的。

它与数据库对话(以及列表中的其他两个选项)是在单元测试中使用外部资源的具体示例(由于它们的不确定性,您不应该这样做)。另一方面,XML可以很容易地准备为“本地”资源(请参阅)。XML树/对象是由配置文件中的值和数据库表中的值的合并组合生成的。这些值合并到一个大型配置对象中,该对象本质上是一个xml树。我正在测试这个对象中是否存在值/节点。这听起来很混乱。为了能够测试一个没有外部依赖的应用程序,通常需要对应用程序进行更改,以便所有外部依赖都由一个单独的层捕获,该层可以留作测试用。你最好看看存根和模子。我想到了模子。如果我使用一个模拟值和一个假值,这是否违背了检查对象属性所需值的目的?取决于。对于测试给定的混合配置输入是否会导致正确的最终值,听起来非常有用。如果输入和输出基本相同,情况就不那么严重了。从本质上说,测试的目的是将原本需要手动执行的工作转变为可重复的自动化工作,我们避免使用外部资源,因为我们希望测试是自包含的,所以尽一切可能实现这两个目标。我不会说,将XML文件存储在解决方案中用于测试目的是个坏主意,但这并不是最“保持友好”的方式。此外,测试依赖XML结构的类可能非常棘手,因为它们很难模拟。XML和接口不能很好地结合在一起,因为继承是XML中不存在的概念。因此,我要努力的是,将XML魔术封装在一个进行读/写操作的包装器中,并在负责添加函数的实际类中编写逻辑,然后进行测试。