使用 Ruby 测试 ASP.NET MVC 应用
使用 Ruby 测试 ASP.NET MVC 应用。
为什么通过 UI 进行测试如此困难(几乎没人做)
为 Web 应用程序编写 UI 测试可能非常繁琐,而且是一项极其重复的任务。此外,应用程序的 UI 在开发过程中往往经常发生变化,这使得 UI 测试成为一个脆弱的资源。更糟糕的是,在运行 UI 测试时,您需要依赖浏览器作为它们的宿主,这使得它们比常规单元测试慢得多。
正是因为这些原因以及其他原因,人们常常不愿费力编写 UI 测试。而且,在我看来,他们这样做是正确的。
但是,我仍然看到许多应用程序在进行微小更改后,UI 出现了故障。如果这些错误没有出现在您的暂存环境中,一旦您部署到生产环境(是的,我见过这种情况发生得太频繁,不得不采取措施来解决),您将颜面扫地。而且,人们在暂存环境中并不总是会遍历整个应用程序。在我见过在允许应用程序进入生产环境之前执行完整测试计划的情况,一只手的手指数都绰绰有余。我们这里唯一的后备方案就是我们的单元测试,顾名思义,它们用于测试(小的)单元,而不是整个应用程序(即:端到端测试)。
当然,您可以使用测试框架来运行 UI 测试,Selenium 就是其中之一。我曾在几个项目中使用过 Selenium,但由于测试速度慢、测试难以维护等原因,我常常很快就放弃了。
现在,我最近参加了我的好朋友 Michel (@michelgrootjans) 的 Ruby and Rails for n00bs 会议,并接触了一些 Ruby 测试 gem,这些 gem 实际上为您的 .NET 应用程序也带来了一些机会。
在这篇博文中,我想概述一下如何设置这些 Ruby 测试 gem,以便它们可以为 ASP .NET MVC 应用程序(或任何 .NET Web 应用程序)运行 UI 测试。我将在此描述的技术(和 gem)是
- Ruby(当然)
- RSpec
- Capybara
- Selenium
- PhantomJS
- Poltergeist
设置测试环境
首先,让我们设置好我们的环境。为此,您需要 Ruby,您可以在此处找到。安装后,您可以从命令行运行以下命令来测试是否一切正常
irb
这将打开一个 Ruby REPL 循环,您可以在其中测试语句(例如 1+1,应给出答案 2)。
设置好之后。退出 REPL 循环并开始安装所有必要的 gem
gem install rspec
gem install capybara
gem install selenium-webdriver
gem install poltergeist
现在我们还需要安装 PhantomJS,您可以在此处找到,以及 Firefox(由默认的 Selenium Web Driver 使用,我将在后面的博文中提供其他选项)。这就是开始所需的一切。
使用 rspec 编写第一个测试
我们现在可以开始编写测试了。我们的测试将放置在 spec 文件夹中单独的 _spec.rb 文件中。例如,如果您想为客户编写规范测试,您将有一个 customers_spec.rb 文件,为产品编写测试,您将有一个 products_spec.rb 文件。当然,您可以随意命名和组织您的规范测试,只需确保有一个 spec 文件夹,其中至少包含一个 _spec 文件。
一个 spec 看起来像这样
describe 'adding a new customer' do
it 'should be able to create a new customer' do
end
end
正如您所见,您以 describe 开头,它告诉您想要测试哪种行为。it 部分包含预期的结果(我们稍后会添加)。暂时不用担心 Ruby 语法。对于使用 BDD 风格测试框架的人来说,describe 和 it 语法应该看起来很熟悉。
我们要测试的将是网站的行为。为此,我们将使用 capybara 和 selenium gem。由于我们希望这个第一个 spec 和所有后续的 spec 都使用相同的测试设置(例如,我们要测试的站点的 URL),我们将为此使用一个 spec_helper.rb 文件。在此文件中,我们将要求所有必要的 gem 并完成所有设置。每个单独的 spec 文件将要求这个 spec_helper 文件
require 'capybara/rspec'
require 'selenium/webdriver'
Capybara.run_server = false
Capybara.default_driver = :selenium
Capybara.app_host = 'https:///TheApplication'
在 require 语句之后,我们配置 capybara。首先,我们告诉它不要运行其服务器。由于 capybara 本质上是一个 Rails 测试框架,它默认在 Rack 应用程序下运行。我们不会这样做,因为我们的应用程序将在 IIS (Express) 或类似的服务器上运行。接下来,我们告诉它使用哪个驱动程序,最后是我们的应用程序的位置(如果您愿意,可以测试 www.google.com)。
现在我们有了这个设置,我们可以开始编写第一个测试了。Capybara 实际上允许您在 Web 应用程序中单击按钮和填写字段,而这正是我们将要做的
require 'spec_helper'
describe 'adding a new customer', :type => :feature do
it 'should be able to create a new customer' do
visit '/Customer'
click_link 'Add'
fill_in('first_name', :with => 'Gitte')
fill_in('last_name', :with => 'Vermeiren')
fill_in('email', :with => 'mie@hier.be')
click_button 'Create'
page.should have_text 'New customer created'
end
end
正如您所见,Capybara 提供了单击链接、填写字段、选择选项等方法,最终用于测试您在应用程序中是否获得预期的结果。您可以在此处找到 Capybara 文档及其他功能。
另外请注意,我已将 `:type => :feature` 哈希添加到 describe 中,以便该测试可以被 RSpec 拾取。
一旦您有了这个 spec 文件,您就可以实际运行您的测试了。为此,请打开命令提示符,cd 到 spec 目录正上方的目录,然后运行 rspec 命令
rspec
您会注意到此命令启动需要一点时间,但一旦运行起来,它将启动一个 Firefox 窗口,并在命令提示符中显示错误,因为我假设您还没有实现任何内容来使上述测试成功。我将留给读者您自己来编写一个小型 Web 应用程序以使此测试通过。一旦您完成此操作并运行 rspec 命令,您将在浏览器中看到您在测试中指定的不同字段已填入了您指定的值。
改进我们的测试
现在,我向您承诺,rspec、capybara、ruby 等的回报将值得付出努力。首先,根据经验,我可以告诉您,上述 Capybara 测试比使用 .NET 编写的可比测试要干净得多。但除此之外,我们还可以做得更多。
我们可以开始让我们的测试在无头模式下运行,这意味着我们不再需要浏览器窗口。为此,我们将使用 poltergeist 和 phantomjs。您需要为此修改 spec_helper 文件
require 'capybara/rspec'
require 'selenium/webdriver'
require 'capybara/poltergeist'
Capybara.run_server = false
Capybara.default_driver = :selenium
Capybara.javascript_driver = :poltergeist
Capybara.app_host = 'https:///TheApplication'
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app,
:phantomjs => 'C:\\some_path\\phantomjs.exe')
end
这增加了对 poltergeist 的额外要求,并添加了 javascript_driver 配置设置。此外,我们还告诉 capybara 在哪里可以找到 phantomjs 进程。
您还需要将 `:js => true` 哈希添加到您的 describe 语句中,以便它可以在 phantomjs 中运行
describe 'adding a new customer', :type => :feature, :js => true do
如果您现在使用 rspec 运行测试,您会注意到 Firefox 不会运行,您只会看到命令提示符中关于哪些测试成功或失败的摘要。
我用我们自己的 Web 应用程序进行了一些测试,注意到无头测试比使用浏览器的测试速度快一倍。
进一步改进
我对这个初始测试设置已经相当满意了。它仍然不是最快的测试运行速度,但它允许我进行一些简单的端到端测试,甚至可以用它开始进行一些 BDD 风格的测试。您也可以根据自己的意愿使用 cucumber 来代替 rspec。
在我自己的设置中,我扩展了上面的示例,添加了一些额外的配置设置,以便能够轻松地将我的测试环境从本地切换到暂存环境,并从无头模式切换到浏览器测试。
我还对 Chrome(可实现)和 IE(测试运行速度非常非常慢!)进行了一些测试,但目前更喜欢 Firefox 和无头模式设置。
我还想在每次测试之前和之后添加一些额外的设置来设置和清除我的数据库。这是我还没有弄清楚的事情,但应该很容易添加。