我试图理解TDD,但是我所看到的所有示例都显示了诸如add(),substract()等方法。我了解如何通过unittest进行测试。但是如何测试没有参数的方法呢?
例如,您将如何为该方法编写测试方法?
public List<string> testmethod()
{
List<string> ret = new List<string>();
using (SqlConnection conn = new SqlConnection(constring))
using (SqlCommand cmd = conn.CreateCommand())
{
SqlDataReader reader;
cmd.CommandText = "select * from users";
conn.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
ret.Add(reader["name"].ToString());
}
conn.Close();
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,您必须测试什么?
你的方法实际上做了很多事情,它们是:
不幸的是,其中之一并不真正适合单元测试(查询的执行),但另一件事是。所以理想情况下你应该拆分你的方法,然后你可以测试转换逻辑。
从技术上讲,您不会对该方法进行单元测试。由于代码已耦合到数据库,因此将是一个集成测试。(如果您想将逻辑与数据访问分开进行测试,则可以将其分为两个部分,一个包含逻辑,另一个包含数据访问。)
除了那小小的nitpick,模式是相同的。任何可重复的自动化测试都应包含三个步骤:
假设“ Act”步骤就是这样:
var result = testmethod();
Run Code Online (Sandbox Code Playgroud)
那么,什么是“声明”步骤?您怎么能知道这种方法应做的事?它返回一个结果,所以我想您会检查该结果,以了解在给定的已知条件下它是否正是您所期望的。
这些条件是什么?那是“安排”步骤。这个想法是您建立一个已知的方案,在该方案中您可以预期一个已知的结果。然后执行代码。然后,您检查结果是否符合预期。
例如,Add(1, 1)考虑该对象,而不是已经知道如何测试的示例:
public class Adder
{
public int Augend { get; set; }
public int Addend { get; set; }
public int Add()
{
return Augend + Addend;
}
}
Run Code Online (Sandbox Code Playgroud)
(我知道这是一个愚蠢的东西,但是要忍受我。)
您将如何单独测试该方法?首先设置环境:
// Arrange
var adder = new Adder();
adder.Augend = 1;
adder.Addend = 1;
// Act
var result = adder.Add();
// Assert
Assert.AreEqual(2, result);
Run Code Online (Sandbox Code Playgroud)
在您的情况下,“排列”步骤可能会涉及到很多,因为可以直接访问数据库。但是概念是相同的。测试首先创建系统的已知状态,然后执行操作,然后检查系统的新状态。(如果状态的创建和状态的检查以及之后留下的副作用有些繁琐,那么这很好地表明了代码中的耦合过多,并且您希望将其分解开一点点。)
| 归档时间: |
|
| 查看次数: |
1359 次 |
| 最近记录: |