繁体   English   中英

如何在NUnit中编写集成测试?

[英]How to write an integration test in NUnit?

我们是两名学生撰写学士论文,我们开发了一个Windows应用程序,它应该能够帮助餐厅进行各种沟通。 从根本上说,它应该能够在客人发送订单的那一刻起提供有关订单的信息。

我们在开发过程中省略了测试,但现在决定编写单元测试。 然而,我们发现我们现在可以写入系统的最合适的测试是集成测试,因为我们类中的所有方法都通过LINQ to SQL绑定到SQL存储过程。 我们知道使用存根来伪造数据库的依赖关系,但是当我们的数据库已经与所有函数一起实现时,我们认为它将为我们提供更多的价值来测试几个方法作为集成测试。

如下面的代码所示,我们尝试按照指南行进行单元测试,但这是编写集成测试的正确方法吗?

[Test]
public void SendTotalOrder_SendAllItemsToProducer_OneSentOrder()
{
    //Arrange
    Order order = new Order();
    Guest guest = new Guest(1, order);
    Producer producer = new Producer("Thomas", "Guldborg", "Beverage producer");            
    DataGridView dataGridView = new DataGridView { BindingContext = new BindingContext() };
    order.MenuItemId = 1;
    order.Quantity = 1;

    //Act
    guest.AddItem();
    dataGridView.DataSource = guest.SendOrderOverview();
    guest.SendOrder(dataGridView);
    dataGridView.DataSource = producer.OrderOverview();
    var guestTableOrder = producer.OrderOverview()
        .Where(orders => orders.gtid == guest.GuestTableId)
        .Select(producerOrder => producerOrder.gtid) 
        .Single();

    //Assert
    Assert.That(guestTableOrder, Is.EqualTo(guest.GuestTableId));
}

是的,一般来说,这是如何编写单元测试/集成测试。 您遵守一些重要指导原则:

  • 独特的Act-Arrange-Assert步骤
  • 测试名称描述了这些步骤(可能最后应该有类似“ShouldSendOneOrder”的东西,“应该”通常用于描述Assert)。
  • 每次测试一次断言。

我假设你也遵守其他指导方针:

  • 测试是独立的:它们不会改变持久状态,因此它们不会影响其他测试。
  • 测试现实用例:不要安排违反业务逻辑的星座,不要做不可能的行为。 或者:模仿真实的应用程序。

但是,我也看到引起人们注意的事情。

  • 目前尚不清楚你测试的是哪种行为 我认为一些“行为”属于安排步骤。

  • producer.OrderOverview()这样的方法让我怀疑域对象执行数据库交互。 如果是这样,这将违反持久性无知 我认为应该有一种提供这种方法的服务(但见下文)。

  • 目前尚不清楚为什么dataGridView.DataSource = producer.OrderOverview(); 是必要的测试。 如果是这样,这只会加剧最严重的一点:

  • 业务逻辑和UI纠缠在一起!

    • guest.SendOrderOverview()producer.OrderOverview() :为什么域对象应该知道如何呈现它的内容? 这是演示者(MVP)或控制器(MVC)或视图模型(MVVM)应该负责的事情。
    • guest.SendOrder(dataGridView)这样的方法很邪恶 它将域层与UI框架联系起来。 这个固定的依赖是很邪恶的,当然你也需要这个方法里面的网格视图中的值。 因此,业务逻辑需要对某些UI组件有深入了解。 这违反了告诉 - 不要求原则。 guest.SendOrder应该有简单的参数来告诉它如何执行它的任务,并且域不应该对任何 UI框架有任何引用。

你真的应该解决后一点。 让您的目标是在不与DGV进行任何交互的情况下运行此测试。

如果你继续在课堂上绑定sql,你的测试不是一个大问题。

当程序逻辑非常简单时,您可以使用此方法,但我建议您研究存储库模式 ,因为逻辑变得更加复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM