如何对网站站点进行单元测试?


26

如何对网站站点进行单元测试?在我看来,由于它很大程度上取决于状态和用户输入,因此这是不可行的。

如果不可行,是否有有效的自动化替代方案?


2
如果要进行自动用户界面测试,则需要类似Selenium的工具。但是,如果您要进行自动化的单元测试,则不需要Selenium。您只需要适当的模式即可。看我的答案。
马修·罗达图斯

Answers:


22

是的你可以。您只需要小心地将问题分开即可。简而言之,您必须从代码背后删除所有逻辑,然后将其放入其他类中。

有两种常见的方法可以做到这一点。

简单的方法是根据“系统给我什么信息?我需要在页面上填充什么信息?”来重新考虑所有事件处理程序。然后提供进行该转换的服务类。

在这种情况下,服务层应该对表示层的性质了解甚少。您仍然必须获取从服务返回的数据,并在代码中填充WebForm的正确组件,并且这未经测试(至少通过单元测试,您仍然可以使用集成测试)。但这很少是代码出错的地方,它更有可能在逻辑上失败。

一种更复杂但更有效的方法是使用Model View Presenter模式。当我们尝试进行此操作时,我们发现Presenters很快就与该框架紧密结合,并且我们开发MVP越多,就越清楚地表明MVP确实想成为MVC,但不能成为MVC。

也就是说,其他人已经非常成功地完成了此操作-甚至还有一个webformsmvp框架可用来消除繁重的工作-因此您的工作量可能会有所不同。


1
@jmoreno:不错!我忘记了WebForms和MVP甚至在过去5年中都存在。
pdr

16

显然,整个Web表单页面不是一个单元,因此无法进行单元测试。但是,您可以为自动测试做一些事情:

  • 对页面的各个组件进行单元测试(执行实际逻辑的任何方法)
  • 页面使用的单元测试组件(自定义控件,基础业务逻辑等)
  • 自动化功能测试(通过远程控制浏览器,或通过cURL之类发送HTTP请求)
  • 自动渗透测试(有些工具会尝试找到可能的注入点,并在您的页面上自动运行无害但可检测的注入攻击)
  • 负载测试
  • 根据可用性和房屋风格的要点列表检查布局(尽管这很难自动化;通常不时地手动进行布局更可行)

-1对不起,但是负载测试,渗透测试和布局检查与单元测试无关
Tom Squires

2
@TomSquires:当然不是,如果您仔细阅读我的回答,您会发现我从没说过。但是这个问题似乎使总体上单元测试和自动化测试的概念感到困惑,这就是为什么我列出了可以在Web表单上抛出的各种有意义的自动化测试的原因。
tdammers 2011年

同意,测试网页更可能是某种形式的集成测试,而不是严格定义的单元测试,尽管它仍然可以自动完成您的所有工作
jk。

6
@TomSquires:完全不合理的降票。您自己的问题始于测试整个站点,而这与单元测试无关。Tdammers确定了测试整体和零件的各种方法,并确定了适合进行单元测试的方式。+1
azheglov 2011年

3
很公平。我收回了
Tom Squires

9

很抱歉错过问题的“单元”部分。

SeleniumHQ是您从前端进行测试的朋友。它不是单元测试,更像是黑盒测试。您仍然需要考虑有效的测试用例...


1
+1当我按“发布您的答案”说完全一样时,您的答案就出现了。
yannis 2011年

2
另外,由于op询问的是单元测试,所以我们只需添加一个问题,实际上是功能测试,这在测试用户输入元素时更合适(明智,可行)。
扬尼斯,2011年

+1 cos我一直想使用它,但从来没有舍弃它。有没有人使用过它,这是好事还是值得实施?
NimChimpsky

6
Selenium是一个很棒的工具,但它与单元测试完全无关。
pdr

没错,似乎我在问题中跳过了此信息:/
WarrenFaith,2011年

6

从经验上讲:只有做对了。我所说的“正确”是指在代码后面隐藏最少的代码,以及使Web表单“笨拙”的类似于上述Model-View-Presenter的东西。事实证明,对于棕地应用程序,这非常困难,因为它们并不是在设计时就考虑到这一点的,并且重构/重写页面以使用它是费力的工作。


1

瓦汀

我发现单元Web测试非常有用,即使只是为了给出回归错误或针对新项目的总体思路。

就状态而言,您可以像使用非UI测试一样创建单元测试-它们在测试开始时清除数据库,并重建数据库以包含除了开始状态以外的任何内容。然后,每个单元测试将封装一个页面,或者通常封装一个页面上的不同任务。

http://watin.org/是用于C#/。NET的另一个Web测试工具。您将测试编写为单元测试:

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

它目前基于IE,但对Firefox和Chrome具有一些实验性支持。您几乎可以自动化您在手动测试中可以执行的任何操作,包括Javascript交互。


确认是2016年。今天对WatiN网站的访问向我表明,WatiN可能已经死了。该文档稀疏,不是最新的,并且视频无法播放。我并不是在抱怨-我对开源自愿工具深表谢意-此评论是为了帮助其他像我这样的新人。答案很好,只是指出入门可能需要自我驱动的动手学习。
qxotk

1
对任何想到WatiN方式的人提供进一步帮助,请确认它停滞不前+当前位置在这里:stackoverflow.com/questions/118531/…–
qxotk

0

您不能真正对网站进行单元测试,仅是因为Web请求是在线(或通过TCP堆栈)发生的。因此,测试不符合“单元测试”的定义,它们很可能是端到端测试。

对于这类测试,您可以使用Selenium之类的套件,该套件在后台运行Web浏览器。不过要提一个警告:通常这种测试非常困难且不可预测,因为有许多活动部件!

不过,更有趣的是,我有点担心为什么您需要测试Web表单。您不是在背后的代码中添加了太多的逻辑,并且有机会陷入混乱的业务逻辑吗?


-1

茉莉花

在过去的5年中,Jasmine已经成为前端单元测试的关键工具。它通常与Node和npm结合到自动构建测试中

每个https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework)

Jasmine是JavaScript的开源测试框架。[2] 它旨在在任何支持JavaScript的平台上运行,不侵入应用程序或IDE,并具有易于阅读的语法。它受到其他单元测试框架的严重影响,例如ScrewUnit,JSSpec,JSpec和RSpec。[3]

尽管提到了javascript,但它也可以用于纯Web表单的单元测试。


虽然javascript在Webforms中使用了它,但它不是更新ui的主要方法
Tom Squires

真正。但是,替代方法是...?这就是为什么茉莉花(尽管不是为了达到目的)效果很好。另外,语法几乎与Ruby程序员喜欢的RSpec相同。
Michael Durrant

-2

ASP.NET

在开发ASP.NET网站时,我们可以在以下单元上运行单元测试:

  • BL控制器/演示者
  • Web窗体页面的代码隐藏

根据您的体系结构,可以对所有这些进行TDD。您无法进行单元测试的唯一一件事就是标记文件的布局。


3
这个回答对“如何”的问题说“是可能的”。并非完全有帮助。
RubberDuck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.