单元测试一些Web服务方法

时间:2009-09-16 14:55:54

标签: c# web-services unit-testing

我的老板要我创建.aspx页面,文本框以简化输入信用卡信息,以便我们可以在CreditCard服务中测试一些方法。

多数民众赞成,但我认为我们可以为此进行单元测试。唯一的问题是,我们只需更改传递给单元测试的变量值,而不是将内容输入到Web表单中。

有人能告诉我,如果我们因为没有进行单元测试而不是.aspx页面进行测试并输入测试数据以测试对某些方法的调用而感到疯狂吗?

他最终会告诉我单元测试需要花费太多时间来设置(因为我试图告诉他我们需要进行单元测试),这是一个蹩脚的愚蠢借口。

8 个答案:

答案 0 :(得分:9)

如果您没有对Web服务进行单元测试而不是编写手动测试工具,那就太疯狂了。)

基本上,Web服务是通过远程协议访问的API,为什么不进行单元测试?

答案 1 :(得分:6)

我觉得有点内疚,就像我之前留下的那样,这是一个更严肃的看法:

让我们来看看单元测试服务需要做些什么。真正的单元测试是一种自动化测试,可以测试单个单元(在您的情况下,Web服务没有任何后端系统,如数据库等)。正如其他人所指出的那样,在这种情况下对服务进行适当的单元测试可能为时已晚。

这并不意味着您不能使用单元测试框架(例如MSTest,xUnit.net,NUnit等)来推动您的服务测试。让我们将 场景与开发一个抛弃的aspx页面进行对比:

  • 两种情况下我将假设Web服务已经部署,配置和运行,因为在aspx场景中可能就是这种情况。
  • 两种情况中,您必须向测试项目添加服务引用以生成Web服务代理。
  • 两种情况中,您必须编写将值应用于Web服务方法的请求参数的代码。
  • 两种情况中,您需要调用Web服务操作。

那有什么不同?

  • 在aspx场景中,您需要从表单字段中收集值并将这些值分配给服务方法参数。使用测试框架,您可以直接编写这些值。实际上编写自动化测试更容易。的 1-0
  • 在aspx场景中,您需要编写获取响应数据并将其写入网页的代码。相反,使用测试框架,您需要编写断言。我会声称写断言更容易,但这有点主观,所以我会把这个作为一个平局 - 仍然 1-0
  • 在自动化测试场景中,您需要编写许多具有不同值的测试,因此与aspx选项相比,您需要编写更多代码。的 1-1
  • 使用自动化测试套件,您可以随后每天多次针对数据库运行自动化测试套件,无需额外工作,而您需要手动输入并手动验证结果每次测试运行的aspx场景。这是测试工作的巨大胜利。 2-1 (这是保守的)

总之,我会说,如果你不坚持在这种情况下进行真正的单元测试,而只是利用一个单元测试框架来编写自动测试,你应该会更好使用自动化测试而不是使用aspx页面。开发工作或多或少都是一样的。

对于你的下一个项目,你可以看看你是否可以从一开始就使用TDD,但这是另一场战斗。

祝你好运。

答案 2 :(得分:3)

如果是ASMX Web服务,您可以尝试在Web.config中启用HttpPost协议:

<configuration>
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpPost"/>
      </protocols>
    </webServices>
  </system.web>
</configuration>

当您在浏览器中访问.asmx页面时,这将启用Web服务的测试表单。它可能不适用于复杂类型;但是如果你有复杂的类型,那么构建单元测试比自定义表单更容易。

单元测试比Web表单更难的论点似乎是错误的;如果您正在开发表单,除了构建页面本身之外,您还必须编写Web服务客户端代码。

答案 3 :(得分:3)

您的老板可能希望确认可以从.aspx页面调用以及能够尝试某些值。 (他是否想要调用其他人用来创建真实网页的代码?)如果您的Web服务调用任何外部服务和/或使用数据库,那么无论如何都很难为它编写自动单元测试。

至于为网络服务编写一个真实的单元测试,我想你这次已经输掉了这场战斗......

下次尝试在编写方法之前或之后为Web服务调用的每个方法编写单元测试。甚至没有必要告诉你的老板你这样做,因为这样可以更快地生成工作代码。

一旦证明单元测试有助于快速编写更好的代码,你可以尝试引入测试驱动开发和/或让单元测试检查源代码控制系统和其他人在更改代码时运行它们。

在老板回家后,你可以在今晚度过一些自己的时间,尝试编写单元测试。然后只告诉他你在为什么你的代码没有错误时做了什么。

答案 4 :(得分:1)

这场战斗肯定会失败。你必须把自己放在你的老板鞋里。有些项目的单元测试可能会花费太多时间,特别是在开发周期结束时,一切都急于完成。必须从一开始就遵循TDD,否则在您已经忘记了特定代码的工作原理后,您将花费太多时间来实现单元测试(不,评论通常是不够的)。

让你做下一个TDD项目的常规做法。在对所有代码单元进行测试后,您可以使用JMeterSelenium等工具实现某种类型的功能测试。

答案 5 :(得分:0)

相反,您可以编写一个简单的.NET(或Java)测试来调用Web服务并检查各种场景,以及明显的好处(可测试),您还可以通过自动方式检查其功能。

编写单元测试时“浪费”的时间将通过一遍又一遍地测试相同场景而节省的时间重新获得,而不是仅仅运行自动化测试。

如果你的老板不相信他那么显示TDD/unit tests effectiveness的研究。

如果所有其他方法都失败了,为什么不使用像soapUI这样的自动工具,至少可以避免一次又一次地手动测试相同的功能。

答案 6 :(得分:0)

在我看来,如果您创建.aspx页面并从Web表单获取价值,那么测试将比单元测试更实时。 我希望Web服务已经过组织的单元测试,它为您提供此Web服务。 我想,你只需要创建.aspx表单并完成你的工作。

您可以对整个开发过程的满意度进行单元测试。 单元测试应该由编写类/函数/ web方法代码的人来完成。

如果您有任何疑问,请与我们联系。

答案 7 :(得分:0)

猜猜你已经输掉了战斗(我们觉得你)。除了为您的Web服务手动创建使用者之外,还有更好的解决方案。

结帐SoapUI。它使用您的WSDL并允许您使用xml请求。如果他们想要的只是一个POC,很容易插入Web服务来测试它。