我正在使用 C# 中的 MSTest 编写单元测试。
函数的最终目标是确保我们能够获取到数据。
我们要测试的函数是这样的:
public static GetMemberName(string member_id)
{
DataTable dt = new DataTable();
string memberName;
String sql = @"SELECT name from MEMBER_GROUP where Member_Id = @Member_Id";
dt = SqlProvider.dbGetDataTable("MY_Table", sql,
SqlParameterBuilder.AddParameter("Member_Id ", member_id));
if ((dt != null) && dt.Rows.Count > 0)
{
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
memberName = dt.Rows[i][0].ToString();
}
}
return memberName;
}
SqlParameterBuilder.AddParameter("Member_Id ", member_id)
会在builder中添加参数,当@"SELECT name from MEMBER_GROUP where Member_Id = "123"
时,使sql行等于
member_id = "123"
我很困惑是否需要检查
sql
变量是否等于
@"SELECT name from MEMBER_GROUP where Member_Id = @Member_Id"`;
并检查是否
SqlParameterBuilder.AddParameter("Member_Id ", member_id)
有效(换句话说,检查函数的参数
dbGetDataTable
),或者只是伪造dbGetDataTable的返回值?
如果我需要检查,我该怎么做?
您可以将单元测试视为开发安全网。他们会尽力帮助您摆脱某些问题。您拥有的测试用例越多,您就越能安全地应对常见的陷阱。
您可以广泛地测试您的代码,但它们可能无法捕获所有意外的更改。您的安全网的主要目标应该是捕获那些具有中等或高概率的“常见”意外变化。因此,尝试集中精力用测试用例覆盖这些代码行,这些代码行可能会在不久的将来进行修改。
让我引用此表第二行:
- 黑盒也称为功能测试、数据驱动测试和闭盒测试。
- 白盒也称为结构测试、明盒测试、基于代码的测试和透明测试。
- 灰盒也称为半透明测试,因为测试人员的编码知识有限。
正如您所看到的,这些方法之间的主要区别在于测试用例对待测试代码的“了解”程度。在白盒测试的情况下,测试也涵盖了实现细节。而在黑盒测试中,您将待测试的代码视为第三方混淆方法,这就是为什么您只关心输入、输出和潜在的副作用(如果有)。
所以,如果函数的最终目标是确保我们能够获取数据,那么我们正在讨论的是黑盒测试,其中您对 sql 查询一无所知,并且
SqlParameterBuilder
。