2012-09-14 23 views
2

我們的團隊對測試非常新穎。我們第一次使用scrum。 在第一次衝刺中,我們在gui上有1個按鈕。按下按鈕將導致將文本文件的內容轉換爲數據庫(在新的線程/任務中)。 gui將顯示任務已啓動並將調查任務的狀態。集成測試(用於填充數據庫的純文本文件)

我們知道如何使用TDD方法進行單元測試。但是完成後,我們必須進行集成測試。

在集成測試中需要執行哪些類型的測試? 我們是否需要通過測試不同的文件來檢查數據庫中的所有內容是否正確填充? (IE:關係,存儲爲varchar(xxx)的特定格式等?)

如果是這樣的話:這可能相當複雜嗎?因爲你沒有1或2個輸入參數,但你有一個完整的文件(我的意思是文件的內容!!!),它是可變的測試。你可以爲這一個按鈕按幾下,或者幾千個測試。最糟糕的是:大多數測試(即格式化)已經在單元測試中進行過測試。

在互聯網上展示的大多數例子更GUI像測試,集成測試(或低於驗收測試的例子嗎?): 登錄使用正確的用戶名和密碼 - 輸入:名+密碼 - 預期輸出:一個重定向到主頁

登錄不正確的用戶名和/或密碼 - 輸入:名和密碼(不正確) - 預期輸出:警告(登錄失敗,不正確的用戶名或密碼)

回答

2

你的問題涉及的努力許多領域轉向更好的測試程序環境建設。因此,首先讓我們看看集成測試。

對於集成測試,大多數情況下需要空數據庫,因爲您正在測試給定特定的一組數據,您可以查詢該數據並獲得所需的結果。

讓我們使用一個簡單的例子,例如UserFinder類,您希望能夠在系統中找到具有給定名稱的用戶並返回可用模型。

public class UserFinder 
{ 
    private SomeDbContext _dbContext; 

    public UserFinder(SomeDbContext dbContext) 
    { _dbContext = dbContext } 

    public User FindUser(string name) 
    { _dbContext.Find<User>(new FindUserByNameQuery(_dbContext, name)); } 
} 

現在在上面,雖然它是一個漂亮的垃圾類,我們可以測試,鑑於用戶在名爲「測試」數據庫,當你調用FindUser(「測試」),你應當得到用戶模型。

因此,作爲本次測試的一部分,你想通過在數據庫中設置了預期的用戶來啓動,那麼你將創建用戶取景器給它一個真正數據庫連接,那麼你會用名稱來查詢數據庫「測試儀」並證明你已經恢復了這個模型。

通過這種方式,您可以在任何情況下運行該測試,無論是IDE構建腳本還是命令行,您都將得到一致的結果,因爲您的測試是自包含的,它會設置場景,運行測試並驗證驗收標準。然後,一旦完成了這個測試,所有的數據都應該被刪除,整個過程就是您只需要設置給定測試所需的內容,並且通常只在該測試中進行設置。

現在理想情況下,集成測試和驗收測試的運行速度比單元測試慢很多,您只需要測試未在單元測試中涵蓋的內容,但同時您希望確保只測試您的邏輯,就像你可以使用NHibernate輕鬆創建上面的測試場景一樣,你會證明NHibernate的工作原理,這不是你的目標。 美國不可能告訴你需要測試什麼,因爲我們不知道你的項目或你想要實現什麼,但你應該對你的應用程序流程有一些瞭解,如果你看到任何點在那個連接數據庫或文件系統的流程中,或者通過一些其他外部邊界傳遞給你有業務邏輯的應用程序,你可能想要把一個測試場景放入。

0

我想說你需要限制什麼正是你正在測試。在業餘時間,我正在使用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); 
     } 
} 

而且不要忘了,沒有自動化測試可以取代通過系統的實體人員並點擊任意按鈕,試圖破壞事物。很多時候單元測試都缺少來自用戶的隨機輸入。這在機器上很難模仿。

+0

最後的評論是真實的,但有點誤導,你可以使用WebDriver等自動化幾乎所有的迴歸/驗收測試,包括單元/集成/接受(或故事)測試等,但是像你說的那樣,探索性測試就是在哪裏您將需要真正的測試人員,但是據說測試人員迴歸週期越多,您就可以自動執行更多的測試。 – Grofit