提问人:mfaani 提问时间:8/11/2016 最后编辑:Jonathan Hallmfaani 更新时间:9/28/2018 访问量:4982
如何对采用参数的方法进行单元测试
How to do unit testing for methods that take parameters
问:
假设我有一个将 and 或任何其他类型作为其输入的 a。someMethod
String
int
当我想为此编写单元测试时,我是否要用我自己给定的 String 和 Int 填充方法,然后通过我的测试运行它?这不会使我的测试依赖于我的输入吗?someMethod
据推测,它们的值(字符串和 int 输入)来自另一个函数,我也应该为该函数进行单独的单元测试,对吧?
答:
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
你的意思是我把多个断言放在一个案例中,而不是每个案例有一个断言?
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 当然,这是最重要的。测试代码是否可以处理意外输入。但是,测试预期的输入和输出也很重要,以便在代码更改中断功能时收到通知。
评论