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

How to do unit testing for methods that take parameters

提问人:mfaani 提问时间:8/11/2016 最后编辑:Jonathan Hallmfaani 更新时间:9/28/2018 访问量:4982

问:

假设我有一个将 and 或任何其他类型作为其输入的 a。someMethodStringint

当我想为此编写单元测试时,我是否要用我自己给定的 String 和 Int 填充方法,然后通过我的测试运行它?这不会使我的测试依赖于我的输入吗?someMethod

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

单元测试 与语言无关 TDD

评论

1赞 SpellChucker 8/11/2016
为什么不创建一个或多个函数来返回随机字符串/int 输出以在测试中使用呢?因此,它将测试广泛的值。
0赞 mfaani 8/11/2016
@ToddVrba我是新手,所以我从来没想过这一点。我想我能做到。
3赞 8/11/2016
@ToddVrba 在单元测试中使用随机数据通常不是一个好主意。这可能导致测试在一个编译上通过,而在另一个编译上失败,原因不明确。相反,您应该构造几个典型的输入值并对其进行测试,以确保运行之间的一致性。诀窍是要全面输入值。

答:

1赞 user887210 8/11/2016 #1

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

Input | Expected Output | Rationale
-------------------------------
test  | TEST            | all lower
Test  | TEST            | initial caps
tEst  | TEST            | middle caps
tesT  | TEST            | last caps
foo   | FOO             | checking different string
1foo  | 1FOO            | mixed string

等。。。

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

评论

0赞 mfaani 8/11/2016
所以每个都会是不同的测试用例?我会有 TestAllLower、TestInitialCaps 等吗?
0赞 8/11/2016
理想情况下,是的。但是,如果它们正在测试类似的功能,则将多个测试用例合并到一个测试中可能是有意义的。你应该这样看待它:如果一个测试用例失败了,要弄清楚是什么让它失败了有多困难?一个测试中的多个测试用例增加了测试的复杂性。
0赞 mfaani 8/11/2016
你的意思是我把多个断言放在一个案例中,而不是每个案例有一个断言?
1赞 8/11/2016
是的,只有在失败时才会中断对的调用,因此您可以在单个情况下使用多个调用:“在 playgrounds 和 -Onone 构建(Xcode 的调试配置的默认值):如果条件计算为 false,则在打印消息后以可调试状态停止程序执行。 assert
3赞 Alexander 8/11/2016 #2

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

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

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

评论

0赞 mfaani 8/11/2016
所以你不检查零值?这应该由开发代码通过以下方式完成:如果允许或只是通过强制解包使您的应用程序崩溃?
2赞 Alexander 8/11/2016
您的示例输入应涵盖您能想到的所有边缘情况,包括输入(当您处理可选参数时)、无意义输入等。nil
2赞 Alexander 8/11/2016
不,一点也不。你的应用代码处理边缘情况,你的单元测试为你的应用代码提供边缘情况,以尝试打破它。
2赞 Alexander 8/11/2016
当你在编写测试时,你的心态不应该是“我能提供什么好的输入,让我的代码在快乐的路径上运行,这样我就可以得到我的绿色复选标记?你的思维方式应该是“我能提供什么意见来打破这个突破,真正确保我已经覆盖了我的基础?
1赞 8/11/2016
@AlexanderMomchliov 当然,这是最重要的。测试代码是否可以处理意外输入。但是,测试预期的输入和输出也很重要,以便在代码更改中断功能时收到通知。