【问题标题】:What is the best way to smoke test a staging/production environment in Rails?在 Rails 中对登台/生产环境进行烟雾测试的最佳方法是什么?
【发布时间】:2014-06-07 02:49:19
【问题描述】:

首先,设置...

我目前正在使用 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 webpages in application, after deployment

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

【问题讨论】:

    标签: ruby-on-rails ruby cucumber smoke-testing


    【解决方案1】:

    是的,您可以使用 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(不是必需的,但没有必要运行您不会使用的本地服务器)
    • 如果您的测试修改了数据库,请将您的测试数据库环境设置为您想要进行冒烟测试的环境。
    • 部署和测试。

    【讨论】:

    • 您能否分享一些方法来跟踪数据并专门删除我们在运行规范时添加的数据?这样我们就不会干扰现有数据
    • @HussainAkram 如果您需要处理现有数据,我不知道除了在测试中编写代码来进行清理之外的其他方法(通过您正在测试的 UI,即更好,或者通过数据库连接,这更危险且更难维护)。最好使用不关心数据的专用服务器,并且可以以任何旧方式清理它。
    【解决方案2】:

    一种简单地击败您的应用程序以查看它是否崩溃的方法是从您的生产 Web 服务器日志文件中获取 GET 请求列表,并将这些请求输入到类似 curlwget 的程序中,该程序将获取它们尽快。

    这是一个简单的例子:

    #!/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 -
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多