假设我有一个具有“storeData(key,data)”和“getData(key)”方法的接口。我应该如何测试具体实现?我应该检查是否已将数据正确设置在存储介质中(例如SQL数据库),还是只需使用getData检查是否返回正确的数据即可?
如果我在数据库中查找数据,则感觉我也在测试方法的内部,但仅检查是否返回相同的数据似乎不完整。
如果我在数据库中查找数据,则感觉我也在测试方法的内部,但仅检查是否返回相同的数据似乎不完整。
您似乎被单元测试的热潮所吸引,但实际上您要做的是一个集成测试。从相同的键中设置并返回相同的值是一个使用存储引擎模拟实现时进行的单元测试,但测试实际存储(比如数据库)而不是模拟存储,这不再是一个单元测试,而是测试的一个基本部分,听起来像是集成测试。不要将单元测试作为您的“万能钥匙”,而应选择适合具体工作的正确工具。将您的测试划分为更多的层次。
Const KEY1 = "somekey"
Const VALUE1= "somevalue"
Const KEY2 = "somekey2"
Const VALUE2= "somevalue2"
Sub SetUpUnitTests()
{
Insert Into SQLTable(KEY1,VALUE1)
}
//this test is not dependent on the setData Method
Sub GetDataTest()
{
Assert.IsEqual(getData(KEY1),VALUE1)
}
//this test is not dependent on getData Method
Sub SetDataTest()
{
storeData(newKey,NewData)
Assert.IsNotNull(Direct Call to SQL [Select data from table where key=KEY2])
}
Sub TearDownUnitTests()
{
Delete From table Where key in (KEY1, KEY2)
}
我认为这取决于数据以后的使用方式 - 如果你只会使用 storeData
和 getData
访问数据,为什么不同时测试这些方法呢?我想有可能会出现错误,稍微难以确定是在 storeData
还是 getData
中,但如果它
如果数据将使用其他机制从数据库中读取或插入,则建议按照你所建议的使用 SQL 检查数据库。
@brendan 提出了一个很好的观点 - 无论你决定使用哪种方法,都将向数据库插入数据。在测试之前和之后清除数据是个好主意,以确保你可以获得一致的结果。
在我的经验中,将测试和编程结合起来是一种常见的技术,我不会回避使用它。我已经用相同的模式进行过序列化/反序列化、解析和打印。
如果你不想访问数据库,你可以使用一个数据库模拟器。有些人在使用模拟器时有着与你相同的感受——这在某种程度上是实现特定的。像所有的事情一样,这是一种权衡:考虑模拟的好处(速度快,不依赖于数据库)和缺点(不能检测到实际的数据库问题,速度慢)。