我正在使用单元测试一段时间。但现在我需要编写集成测试。我应该保存一些东西到DB,而不是检查保存的数据是否正常。 我无法找到简单的集成测试示例。 我的想法是这样做的:
[Test]
public void IntegrationTestExample()
{
// Arrange without mocking
var objec1 = new objec1();
var objec2 = new objec2();
var startTestClass = new startTestClass(objec1, objec2);
var saveData = "test data";
//Act
startTestClass.SaveToDB(saveData);
// Assert
var valueFromDB = SelectSavedData();
Assert.AreEqual(saveData, valueFromDB);
}
//Get data from DB for assert
private string SelectSavedData()
{
var sqlQuery = "Select TOP 1 data from table1";
var data = RepositoryForTest.selectSavedData(sqlQuery);
return data;
}
但我不确定这是不是很好的做法? 你有什么建议吗?
答案 0 :(得分:4)
您应该一次测试一个集成,并使DB处于可以运行多个测试的状态,并且它们不应相互影响。 MS测试框架允许您定义在测试运行期间的某些时间设置和清理测试的方法,如以下代码所示
[TestClass]
public class ReturnServiceTest {
[ClassInitialize()]
public static void ClassInit(TestContext context) {
//INIT TEST DATA FOR THE CLASS
}
[TestCleanup]
public void TestCleanup() {
//CLEANUP DATA AFTER EACH TEST
}
[TestMethod]
public void IntegrationTestExample() {
// Arrange without mocking
var objec1 = new objec1();
var objec2 = new objec2();
var startTestClass = new startTestClass(objec1, objec2);
var saveData = "test data";
//Act
startTestClass.SaveToDB(saveData);
// Assert
var valueFromDB = SelectSavedData();
Assert.AreEqual(saveData, valueFromDB);
}
//Get data from DB for assert
private string SelectSavedData() {
var sqlQuery = "Select TOP 1 data from table1";
var data = RepositoryForTest.selectSavedData(sqlQuery);
return data;
}
}
答案 1 :(得分:1)
当您使用真实数据库时,您应该在每次测试尝试后清理它。
您访问数据的方式也不是很明确,证明RepositoryForTest
不包含任何错误?尝试做你的断言可能的简单的事情。
我对数据库的测试如下:
public void Test()
{
try
{
// Fixture setup
// Create and insert data into Database (with plain ADO code)
// Exercise system
// Verify outcome
// use your data layer here
}
finally
{
// Teardown - other methods to clean the tables afterwards
DatabaseHelper.ClearLookups();
DatabaseHelper.ClearBeds();
...
}
}