Testing 我们应该如何设置复杂的测试环境?

Testing 我们应该如何设置复杂的测试环境?,testing,integration-testing,Testing,Integration Testing,我目前正在进行所谓的集成测试。我想验证一下,如果调用了WCF服务,它将实现我所期望的功能 让我们看一个非常简单的场景。假设我们有一个合同对象,我们可以暂停或取消暂停。现在编写搁置测试非常简单。您创建一个契约实例,并执行将其放在代码中的代码 当我们想要测试起飞等待服务呼叫时,我的问题来了。问题是,搁置合同实际上可能相当复杂,导致各种对象都被修改。所以通常我会使用Builder模式并执行类似的操作 var onHoldContract=new ContractBuilder.PutOnHold.Bu

我目前正在进行所谓的集成测试。我想验证一下,如果调用了WCF服务,它将实现我所期望的功能

让我们看一个非常简单的场景。假设我们有一个合同对象,我们可以暂停或取消暂停。现在编写搁置测试非常简单。您创建一个契约实例,并执行将其放在代码中的代码

当我们想要测试起飞等待服务呼叫时,我的问题来了。问题是,搁置合同实际上可能相当复杂,导致各种对象都被修改。所以通常我会使用Builder模式并执行类似的操作

var onHoldContract=new ContractBuilder.PutOnHold.Build

我现在面临的问题是,我必须复制大部分的暂挂服务。现在,当我改变什么是暂停意味着我有两个地方需要修改

我马上想到的另一个选择是,在我的测试设置中只使用暂挂服务,但现在我将我的测试与另一段代码的成功结合起来,这是我不喜欢做的事情,因为如果暂挂失败,它可能会导致在一个点中断其他地方的不相关测试


还有什么我错过的选择吗?或者关于哪种方法更可取以及为什么更可取的意见?

您可以看看如何使用

模拟框架允许您创建模拟对象,这些对象可以取代真实对象,并在测试中使用时以特定方式响应。这将允许您直接创建人工的保留合同对象,然后将其传递给起飞保留服务。您将在模拟上定义可以验证的特定行为,以便在停止时正确操作


您没有提到您的语言,但所有主要语言都有可用的模拟框架。对于.net来说,一些例子将是有用的。对于Java,一个流行的是。如果你用谷歌搜索你正在使用的任何一种语言的话,你会发现加载量会更大。

你可以看看如何使用

模拟框架允许您创建模拟对象,这些对象可以取代真实对象,并在测试中使用时以特定方式响应。这将允许您直接创建人工的保留合同对象,然后将其传递给起飞保留服务。您将在模拟上定义可以验证的特定行为,以便在停止时正确操作


您没有提到您的语言,但所有主要语言都有可用的模拟框架。对于.net来说,一些例子将是有用的。对于Java,一个流行的是。如果你用谷歌搜索你正在使用的任何一种语言,你会发现负载会更多。

模拟框架是单元测试的一个很好的选择。但据我所知,在这个阶段你们实际上在做集成,对吗?因此,从客户端的角度来看,您将WCF服务称为黑盒。我假设在执行暂挂操作时,必须对存储库数据库、XML文件等执行一些持久性操作

在这种情况下,仅在测试端使用模拟框架对您没有多大帮助,因为为了测试Off-Hold操作,您需要一个处于正确状态的On-Hold对象,包括存储库条目等。在我看来,不必重新发明轮子就可以做到这一点的唯一方法是首先使用服务将其挂起。但是如果你是admant去耦合,那么你需要设置环境,这意味着代码复制我实际上必须在一些集成测试场景中这样做-我要做的是在测试运行开始时设置它

请注意,在服务本身的实现中,您的单元测试将在较低的级别上进行,并且您应该尽可能地将其解耦-这就是我将应用模拟框架的地方


我希望这会有所帮助。

模拟框架是单元测试的一个好选择。但据我所知,在这个阶段你们实际上在做集成,对吗?因此,从客户端的角度来看,您将WCF服务称为黑盒。我假设在执行暂挂操作时,必须对存储库数据库、XML文件等执行一些持久性操作

在这种情况下,仅在测试端使用模拟框架对您没有多大帮助,因为为了测试Off-Hold操作,您需要一个处于正确状态的On-Hold对象,包括存储库条目等。在我看来,不必重新发明轮子就可以做到这一点的唯一方法是首先使用服务将其挂起。但是如果你是admant去耦合,那么你需要设置环境,这意味着代码复制我实际上必须在一些集成测试场景中这样做-我要做的是在测试运行开始时设置它

N 注意,在服务本身的实现中,您的单元测试将在较低的级别上进行,并且您应该尽可能地将其解耦-这就是我将应用模拟框架的地方


我希望这能有所帮助。

正如我提到的,我正在做集成测试,这使得模拟变得毫无意义。仅仅因为它是一个集成测试并不意味着模拟对象不能使用。您仍然需要测试您的WCF服务调用是否与它下面的层集成(假定为n层体系结构)。我并不是说你应该像在真正的单元测试中那样嘲笑你的层边界,只是你的业务对象。如果这不是你想要的,你就没有其他选择了。我们有一个类似的测试设置,我们使用其他服务调用来设置对象。你只需要接受不相关的失败问题。集成测试的本质就是建议测试整个系统。你最后的评论就是我要找的论点。@ShaneC。哈哈,也许我应该把我的答案编辑成这句话。正如我提到的,我正在做集成测试,这使得模拟变得毫无意义。只是因为它是一个集成测试并不意味着模拟对象不能使用。您仍然需要测试您的WCF服务调用是否与它下面的层集成(假定为n层体系结构)。我并不是说你应该像在真正的单元测试中那样嘲笑你的层边界,只是你的业务对象。如果这不是你想要的,你就没有其他选择了。我们有一个类似的测试设置,我们使用其他服务调用来设置对象。你只需要接受不相关的失败问题。集成测试的本质就是建议测试整个系统。你最后的评论就是我要找的论点。@ShaneC。哈哈,也许我应该把我的答案编辑成这句话。至少你读了我的问题;是的,我也不能想出任何其他的选择,似乎仅仅使用导致我想要出现的状态的代码比在其他地方复制工作要容易得多;是的,我也不能想出任何其他的选择,而且似乎仅仅使用导致我想要出现的状态的代码比在其他地方复制工作要容易得多。正如我在开始时提到的,我正在进行集成测试。在这种情况下,mock不是一个好主意,因为我想看看所有东西是如何集成在一起的。正如我在开始时提到的,我正在进行集成测试。在这种情况下,mock不是一个好主意,因为我想看看所有东西是如何集成在一起的。