代码之家  ›  专栏  ›  技术社区  ›  Robert Koritnik

如何在中编写集成和系统测试Asp.netMVC公司

  •  9
  • Robert Koritnik  · 技术社区  · 14 年前

    我的申请

    我的应用程序设计如下所示:

    • 服务层—使用POCO和调用存储库的业务流程
    • POCO层-定义用于这些层之间交互通信的所有类

    所以我的数据层对数据模型实现是完全透明的,因为上层根本不使用数据实体。

    测试

    据我所知,单元、集成和系统测试(与Asp.netMVC)这是:

    • 单元测试-这个很简单。模拟解耦的对象并将它们注入到单元测试中,以便被测试的单元使用它们
    • 集成测试—应该创建一组生产功能单元并模拟其余的单元:因此编写集成测试,测试控制器、服务和存储库集成,而不实际使用生产数据库

    问题

    我可以很容易地看到如何编写单元测试以及系统测试,但我不知道如何编写集成测试?也许我对这些的看法完全扭曲了,我一点也不理解。

    应该如何为一个系统编写集成和系统测试Asp.netMVC应用程序?

    一些有助于解释问题的代码

    假设我有这样的课程:

    • TaskController 呼叫 TaskService
    • 任务服务 呼叫 TaskRepository
    • 任务库 内部操作EF数据

    public class TaskController
    {
        private ITaskService service;
    
        // injection constructor
        public TaskController(ITaskService service)
        {
            this.service = service;
        }
    
        // default constructor
        public TaskController() : this(new TaskService()) {}
    
        public ActionResult GetTasks()
        {
            return View(this.service.GetTasks());
        }
        ...
    }
    
    public class TaskService : ITaskService
    {
        private ITaskRepository repository;
    
        // injection constructor
        public TaskService(ITaskRepository repository)
        {
            this.repository = repository;
        }
    
        // default constructor
        public TaskService() : this(new TaskRepository()) {}
    
        public IList<Task> GetTasks()
        {
            return this.repository.GetTasks();
        }
        ...
    }
    
    public class TaskRepository : ITaskRepository
    {
        public IList<Task> GetTasks()
        {
            // code that gets tasks from EF and converts to Task POCOs
        }
        ...
    }
    

    单元测试很简单,如下所示:

    public void UnitTest()
    {
        var mock = new Mock<ITaskService>();
        // other code that mocks the service
    
        TaskController controller = new TaskController(mock.Object);
    
        // do the test
    }
    

    public void IntegrationTest()
    {
        // no mocking at all
        TaskController = new TaskController();
        // do some testing
    }
    

    3 回复  |  直到 14 年前
        1
  •  5
  •   Brian Mains    14 年前

    对我来说,系统测试将是功能测试(使用fit之类的测试的另一个级别),或者通过testcomplete或telerik的QA工具之类的工具进行ui测试。

        2
  •  2
  •   Jeff Ogata    14 年前

    WatiN Selenium

    你可能还想看看 T.S.T. SpecFlow 如果您对.NET中的BDD感兴趣。

        3
  •  2
  •   Community Romance    7 年前

    我刚刚回答了一个相关的问题: Integration tests implementation . 我认为,它在这里提出了一个明确的方法,解决了这个问题。

    问题的一部分是更高级别的集成测试变得太复杂。这是问题的本质,所以我更喜欢通过单元测试和集中集成测试(取决于所涉及的类),确保所有独立的部分都按预期工作。

    推荐文章