Unit testing 如何对采用参数的方法进行单元测试

Unit testing 如何对采用参数的方法进行单元测试,unit-testing,language-agnostic,tdd,Unit Testing,Language Agnostic,Tdd,假设我有一个someMethod,它将字符串和int或任何其他类型作为输入 当我想为这个someMethod编写单元测试时,我是不是要用我自己给定的字符串和Int填充这个方法,然后在测试中运行它?这不会使我的测试依赖于我的输入吗 假设它们的值(字符串和int输入)来自另一个函数,我也应该对该函数进行单独的单元测试,对吗?单元测试主要用于测试接口,您已经为代码定义了行为,并且正在测试这些行为。例如,您有一组将字符串大写的代码。您将传入两组不同的文本,并验证它们是否有效: 输入|预期输出|基本原理

假设我有一个
someMethod
,它将
字符串
int
任何其他类型作为输入

当我想为这个
someMethod
编写单元测试时,我是不是要用我自己给定的字符串和Int填充这个方法,然后在测试中运行它?这不会使我的测试依赖于我的输入吗


假设它们的值(字符串和int输入)来自另一个函数,我也应该对该函数进行单独的单元测试,对吗?

单元测试主要用于测试接口,您已经为代码定义了行为,并且正在测试这些行为。例如,您有一组将
字符串大写的代码。您将传入两组不同的文本,并验证它们是否有效:

输入|预期输出|基本原理
-------------------------------
测试|测试|全部降低
测试|测试|初始封盖
测试|测试|中间盖
测试|测试|最后盖帽
foo | foo |检查不同的字符串
1foo | 1foo |混合字符串
等等

是的,您应该使您的单元测试全面,并尝试涵盖尽可能多的代码。您可以测试单个函数,但更重要的是测试对象、协议和重要独立函数的接口。这就是为什么它被称为单元测试,您正在测试一个代码块或代码单元,而不是单个代码块。

仅依赖其输入参数(而不是全局/实例状态)和输出返回值的函数(或方法)实际上是最容易测试的。他们被称为。由于“纯”函数的可测试性非常容易,因此努力在“纯”函数中包含尽可能多的代码变得越来越流行

您向他们提供示例输入(来自硬编码值、模拟框架、测试数据库等),并将输出与您期望的结果进行比较


另一方面,在测试中处理非纯函数/方法要困难得多。您需要将实例的状态设置为特定的先决条件,调用要测试的方法,然后在变异后测试实例。这是一个更长的过程。

为什么不创建一个或多个函数,返回随机字符串/int输出,以便在测试中使用?因此,它将测试各种各样的值。@ToddVrba我是一个新手,所以我从未想过这一点。我想我可以做到。@ToddVrba在单元测试中使用随机数据通常不是一个好主意。这可能会导致测试在一个编译上通过,而在另一个编译上失败,原因不明。相反,您应该构造几个典型的输入值并进行测试,以确保运行之间的一致性。诀窍在于输入值的全面性,所以不检查nil值?这应该由开发代码通过以下方式完成:如果让应用程序崩溃,或者干脆通过强制展开使应用程序崩溃?您的示例输入应该涵盖您可以想到的所有边缘情况,包括
nil
input(当您处理可选参数时)、非感知输入等。不,一点也不。你的应用程序代码处理边缘情况,你的单元测试为你的应用程序代码提供边缘情况,试图打破它。当你编写测试时,你的心态不应该是“我能提供什么好的输入,让我的代码顺利运行,这样我就可以得到我的绿色复选标记?”你的心态应该是“我能提供什么样的信息来打破这一僵局,以确保我的基础得到了保障?“@AlexanderMomchliov这当然是最重要的。测试代码是否可以处理意外输入。然而,测试预期的输入和输出也是很重要的,如果代码更改破坏了功能,那么每个都是不同的测试用例?我会有TestAllLower、TestInitialCaps等?理想情况下,是的。但是,如果多个测试用例正在测试类似的功能,那么将它们组合成一个测试可能是有意义的。您应该这样看待它:如果一个测试用例失败了,那么找出它失败的原因有多困难?一个测试中的多个测试用例增加了测试的复杂性。你是说我在一个测试用例中放置了多个断言,而不是每个测试用例都有一个断言?是的,对
assert
的调用只有在失败时才会中断,因此你可以在一个测试用例中使用多个断言:“在操场和-Onone构建中(Xcode调试配置的默认设置):如果条件的计算结果为false,请在打印消息后在可调试状态下停止程序执行。“-