我想說你需要限制什麼正是你正在測試。在業餘時間,我正在使用EF5作爲後端,使用存儲庫和數據服務來開發MVC4項目。我試圖嘲笑EntityFramework的行爲,但它太複雜了。一般來說,這裏的人們都認爲嘲笑數據庫環境是非常沒有意義的。微軟也在測試,所以不要打擾測試你已經測試過的MS。
在我的項目中,我已經爲此設置了測試項目和測試數據庫。但我不測試存儲庫,因爲它們非常透明且接近EF。我通過給測試數據庫提供真實的上下文和連接字符串來測試我的數據服務。 對於每個測試類,我將刪除數據庫並重新創建結構。我正在重新填充每個測試的數據,因此測試始終針對相同的數據運行。
這被認爲是一個集成測試,因爲在這裏我正在經歷幾個層次,在我打到數據庫之前。在這些測試中,我正在處理DB和DbContext的其他問題中關係的所有可能的問題。
但是,就我去進行集成測試而言 - 我的控制器(和其他對象)是用模擬的依賴關係(我使用Moq)進行測試的。 而且一旦我對UI有更進一步的瞭解,我可能會通過Selenium爲網頁寫一些測試。
這裏是我的測試項目中的一些例子:
[TestFixture]
class ProjectDataServiceTest
{
private ProjectDataService _projectDataService;
private DatabaseSeeder _seeder;
private SiteContext _context;
[TestFixtureSetUp]
public void FixtureSetUp()
{
_context = new SiteContext(); // connection string is taken from app.config file
_seeder = new DatabaseSeeder(_context);
_seeder.InitialiseDb(); // create database structure
ProjectRepository projectRepository = new ProjectRepository(_context);
_projectDataService = new ProjectDataService(projectRepository);
}
[SetUp]
public void TestSetUp()
{
_seeder.SeedDatabase(); // put some test data from a script
}
[TearDown]
public void TestTearDown()
{
_seeder.RemoveData(); // delete everything from all the tables
}
/**************** Tests are here! ********************/
[Test]
public void CheckDatabaseConnectivity()
{
Assert.Pass();
}
[Test]
public void GetNoProjectsForUser()
{ // should return no project for this user, as nothing is assigned
var user = _seeder.Users[0];
var projects = _projectDataService.GetUserProjects(user);
Assert.IsEmpty(user.UserProjectRoles);
Assert.IsEmpty(projects);
}
[Test]
public void GetAllProjetsForUser()
{
var user = _seeder.Users[2];
var projects = (List<Project>)_projectDataService.GetUserProjects(user);
int count = user.UserProjectRoles.Count;
Assert.AreEqual(count, projects.Count);
Assert.False(projects.Contains(_seeder.Projects[0]));
}
}
控制器在一個普通的香草單元測試方式測試:
[TestFixture]
class ProjectsControllerTest
{
private ProjectsController _projectController;
private Mock<IProjectDataService> _projectDataService;
private Mock<ICurrentUserService> _currentUserService;
[SetUp]
public void SetUp()
{
MapperConfig.SetMappings();
_projectDataService = new Mock<IProjectDataService>();
_currentUserService = new Mock<ICurrentUserService>();
_currentUserService.Setup(s => s.GetCurrentAppUser()).Returns(new AppUser());
_projectController = new ProjectsController(_projectDataService.Object, _currentUserService.Object);
}
[Test]
public void InstanceOfProjectController()
{
Assert.IsInstanceOf<ProjectsController>(_projectController);
}
[Test]
public void Index()
{
var projects = new List<Project>() { new Project() { Name = "one" }, new Project() { Name = "two" } };
_projectDataService.Setup(s => s.GetUserProjects(It.IsAny<AppUser>())).Returns(projects);
var view = _projectController.Index();
Assert.IsInstanceOf<AutoMapViewResult<List<ProjectViewModel>>>(view);
}
}
而且不要忘了,沒有自動化測試可以取代通過系統的實體人員並點擊任意按鈕,試圖破壞事物。很多時候單元測試都缺少來自用戶的隨機輸入。這在機器上很難模仿。
最後的評論是真實的,但有點誤導,你可以使用WebDriver等自動化幾乎所有的迴歸/驗收測試,包括單元/集成/接受(或故事)測試等,但是像你說的那樣,探索性測試就是在哪裏您將需要真正的測試人員,但是據說測試人員迴歸週期越多,您就可以自動執行更多的測試。 – Grofit