15

首先,设置...

我目前正在使用 Ruby 1.8.7 MRI 在 Mac OS X 上开发 Rails 3 应用程序,针对 MySQL 数据库运行测试和本地开发。我在公司为每个名为 dev、tqa 和 prod 的应用程序使用了 3 个“其他”非本地环境。它们使用 JRuby (1.8.7) 和 Oracle 作为后端在 Tomcat 中运行。

如您所见,环境完全不同,我们在部署到本地不存在的 Oracle/JRuby 环境时遇到了一些错误(如日期处理和在 Oracle 中指定默认模式)。

我喜欢在本地运行 Cucumber/Webrat/Capybara 之类的东西来访问应用程序中公开的每个 URL,以确保基本的东西正常工作(即烟雾测试)。理想情况下,它会点击每个 url,并且会做一些简单的事情,比如在表单中输入数据和点击按钮等。

理想情况下,当我部署到 dev/tqa 时,我会运行类似的东西,除了指向已部署的应用程序而不是本地应用程序。Cucumber 似乎针对本地运行的应用程序进行了优化,并与 Rails 很好地集成,但不能针对所有意图运行“外部”应用程序(或者至少我找不到一种实际可行的简单方法)。

此外,当我部署到 prod 时,我希望运行一套类似的冒烟测试,但它不会改变当前生产数据库的状态(即,只会获取 URL)。

我想可以使用像 Selenium 这样的东西,但我真的很想像使用 Cucumber 一样运行一个 rake 任务并返回结果。

是否有任何 Rails/Ruby 方法可以做到这一点,或者其他人只是使用 wget 或 Selenium 推出自己的解决方案?

这里问了一个类似的问题:Automatically Smoke test all pages in application, after deployment

不过,我不确定这个问题是否正是我的想法。

4

2 回答 2

7

是的,您可以使用 Cucumber 和 Capybara 编写冒烟测试并针对远程服务器运行它们。我已经做到了,并且有效。我在一些项目上也做过curl/wget之类的,但是 Cucumber+Capybara 允许您与页面交互(甚至是使用 Javascript 的页面),而不仅仅是抓取它们。

  • Capybara的Rack::Test驱动不支持远程请求;它的 Javascript 驱动程序可以。无论您是否真的需要 Javascript 来处理您正在测试的页面,您都需要使用 Javascript 驱动程序。根据驱动程序的文档配置 Capybara 以使用 Javascript 驱动程序并标记您的测试@javascript。(我推荐 poltergeist/PhantomJS 驱动程序;它比 Selenium 更快,比 capybara-webkit 提供更好的错误,并且易于设置。)奖励:你可以在测试中做需要 Javascript 的事情,而且你会冒烟-测试你的整个堆栈,包括 Javascript。
  • 编写你的测试,这样它们要么不需要自己清理,要么以在生产数据库中安全的方式进行。他们不能使用 DatabaseCleaner。(为防止意外,请将测试放在他们自己的项目中,并使用不包含 DatabaseCleaner 的 Gemfile。)由于冒烟测试将针对远程服务器运行,因此也不能使用事务进行清理,因此它们必须要么不修改数据库或必须专门删除他们创建的对象。
  • Capybara.app_host = "http://your-server.yourco.com"
  • 设置Capybara.run_server = false(不是必需的,但没有必要运行您不会使用的本地服务器)
  • 如果您的测试修改了数据库,请将您的测试数据库环境设置为您想要进行冒烟测试的环境。
  • 部署和测试。
于 2014-05-31T13:22:12.837 回答
5

一种简单地击败您的应用程序以查看它是否崩溃的方法是从您的生产 Web 服务器日志文件中获取 GET 请求列表,并将这些请求提供给类似的程序,curl或者wget尽可能快地获取它们。

这是一个简单的例子:

#!/usr/bin/env ruby
# rerun

require 'uri'

def extract_from_log(base_uri, log_path)
  File.open(log_path) do |log|
    while (line = log.gets)
      if (line.match(%r{"GET (/\S+) HTTP/\d\.\d"}))
        uri = URI.join(base_uri, $1)
        puts uri.to_s
      end
    end
  end
end

base_uri, log_path = ARGV

if (base_uri and log_path)
  extract_from_log(ARGV[0], ARGV[1])
else
  puts "Usage: #{File.basename($0)} <base_uri> <log_path>"
  exit(-1)
end

给定具有匹配行的标准 Web 日志文件,"GET /... HTTP/1.1"您可以轻松提取路径,但必须提供基本 URI:

rerun http://example.com/ example.log

这将列出在该日志文件中找到的所有 URL。您可以通过管道将其wget用于获取目的:

rerun http://example.com/ example.log | wget -i -

如果您破坏了任何东西,您将开始在您的应用程序中遇到错误,并且通过适当的通知系统,您将能够捕获并追踪它们。

于 2011-04-13T15:19:09.507 回答