如何对使用String.IsNullOrEmpty的代码进行单元测试?

5
你是否会写两个单元测试?一个用于值为 Null,另一个用于值为空字符串?同样的方式适用于 string.IsNullOrWhiteSpace() 吗?

这不是关于测试内部的.NET方法! - Skorunka František
4个回答

3

通常情况下,您需要测试所有可能的输入类别(空、空字符串、空格和非空格),以确保输出正确。

这意味着要测试 String.IsNullOrEmpty() 的两个选项和 String.IsNullOrWhiteSpace() 的三个选项。


我也是这么想的,但有些测试用例非常冗长,这种情况下只能进行复制和粘贴(这违反了DRY原则)。 - Skorunka František
这不完全是复制粘贴,因为它测试了不同的场景。DRY是一种原则,而不是硬性规定。添加尽可能多的测试,以便您对代码库感到自信。 - Cristian Lupascu
所有可能的输入?即使仅测试仅包含空格的所有可能字符串:" "," "," ",... a) 实际上并不实用,因为它们的数量受到您的内存大小的限制(如果生产环境中的内存比测试服务器上的内存更多,那该怎么办,哦,我们已经发现了可能性!)b) 这是浪费时间!人们不要对单元测试如此虔诚(==非理性崇拜)。 - Steves
@Steves 我说的是“输入”,但我想表达的是“输入类别”。我编辑了我的回答以澄清这一点。 - Cristian Lupascu

2
通常我会使用 NUnit 测试用例来测试这些排列组合。这将为您提供三种不同检查的覆盖范围,而不会重复测试代码。
例如:
[TestCase("")]
[TestCase(null)]
public class SomeTest(string stringValue)
{
   Assert.Throws<ArgumentException>(()=> CheckIfNullOrEmpty(stringValue));
}

public void CheckIfNullOrEmpty(string val)
{
   if(string.IsNullOrEmpty(val))
   {
       throw new ArgumentException();
   }
}

0

编程方面的内容,返回翻译文本:

关于需要编写多少单元测试没有固定规则,但是我建议您至少进行以下4种测试:

被测试的代码:

public string MyMethod(string s){
//Do stuff
  if (string.IsNullOrWhitespace(s)){
    return "failed";
  } else {
    return "passed";
  }
}

因为你正在测试一个黑盒子,所以需要考虑以下情况:

NULL
""
"   "
"A"

你可能还需要做更多的工作,例如:

" A "
"AAAA"
etc

在进行单元测试时,主要关注点应该是“好”的情况。因此,我希望通过的测试比失败的测试更多。


0
真正的答案是,您不应该测试框架提供的功能。将此类方法视为已由Microsoft测试过的工具箱中的工具。
相反,您应该专注于测试使用此方法的代码的输出。操作必须有不同的逻辑路径,这些路径取决于所讨论的字符串是否为空或null,这才是您应该在测试中关注的内容。

1
是的,有一个基于String.IsNullOrWhitespace()结果的工作流程。假设一个方法应该在if(String.IsNullOrWhitespace(p))时执行MethodA,在if(!String.IsNullOrWhitespace(p))时执行MethodB。你会创建四个测试吗?p = null,p = string.Empty,p = "\n \r",p = "value"? - Skorunka František

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接