【问题标题】:Ruby Minitest: Suite- or Class- level setup?Ruby Minitest:套件级还是类级设置?
【发布时间】:2011-10-09 01:08:17
【问题描述】:

使用内置的 Ruby Minitest 框架,有没有办法在整个套件运行之前运行一些代码,甚至在整个 TestClass 运行之前运行一次?我在this question 的回答中看到 Test::Unit::after_tests 可用于在运行所有测试后运行代码;有没有类似的方法在所有测试都运行之前运行代码?

我想使用此功能在测试运行之前初始化一个测试数据库,并在它们全部运行后将其拆除。

谢谢!

【问题讨论】:

    标签: ruby minitest


    【解决方案1】:

    这是从 MiniTest docs 修改而来的(在 Customizable Test Runner Types 下)。

    class Burger
      def initialize
        puts "YOU CREATED A BURGER"
      end
    
      def has_cheese?
        true
      end
    
      def has_pickle?
        false
      end
    end
    
    gem 'minitest'
    
    require 'minitest/unit'
    MiniTest::Unit.autorun
    
    class MyMiniTest
      class Unit < MiniTest::Unit
    
        def before_suites
          # code to run before the first test
          p "Before everything"
        end
    
        def after_suites
          # code to run after the last test
          p "After everything"
        end
    
        def _run_suites(suites, type)
          begin
            before_suites
            super(suites, type)
          ensure
            after_suites
          end
        end
    
        def _run_suite(suite, type)
          begin
            suite.before_suite if suite.respond_to?(:before_suite)
            super(suite, type)
          ensure
            suite.after_suite if suite.respond_to?(:after_suite)
          end
        end
    
      end
    end
    
    MiniTest::Unit.runner = MyMiniTest::Unit.new
    
    class BurgerTest < MiniTest::Unit::TestCase
    
      def self.before_suite
        p "hi"
      end
    
      def self.after_suite
        p "bye"
      end
    
      def setup
        @burger = Burger.new
      end
    
      def test_has_cheese
        assert_equal true, @burger.has_cheese?
      end
    
      def test_has_pickle
        assert_equal false, @burger.has_pickle?
      end
    
    end
    

    请注意,我包含 gem 'minitest' 以使用 gem 而不是没有 MiniTest::Unit.runner 方法的捆绑版本。这是输出。

    Run options: --seed 49053
    
    # Running tests:
    
    "Before everything"
    "hi"
    YOU CREATED A BURGER
    .YOU CREATED A BURGER
    ."bye"
    "After everything"
    
    
    Finished tests in 0.000662s, 3021.1480 tests/s, 3021.1480 assertions/s.
    
    2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
    

    所以它调用了两次#setup,但只调用了一次.before_suite.after_suite,我想这就是你要找的。​​p>

    【讨论】:

    • 不幸的是,在第 5 版中,runner 被删除了......我想它解释了为什么 minitest 有这么多分支,你只需要在它工作之前对其进行修补......
    【解决方案2】:

    在 MiniTest 套件中的所有测试运行之前和之后处理时间的另一种方法是将 if 块放在 setupteardown 方法中,以控制这些块只被调用一次。

    这样,您可以在测试套件开始时只加载一次浏览器和其他依赖项(例如页面对象),然后在所有测试完成后关闭浏览器。

    这是一个使用 MiniTest 5.5.1 和 Watir 的示例:

    class CoolTests < Minitest::Test
    
      @@setupComplete  = false  # tracks whether 1-time setup has completed, so we only instantiate a browser and dependent pages/modules one time per suite run
      @@testsRun       = 0      # tracks how many tests have run so we can close the browser when all tests complete
    
      def setup                                                    # Minitest#setup runs before every #test method
        @@testsRun+=1                                              # increment tetsRun indicating that a test has run
        if (!@@setupComplete)                                      # we load the browser and necessary page objects here one-time if we haven't already
            @@driver = Watir::Browser.new :chrome                  # instantiate new chrome browser
            @@driver.window.maximize                               # maximize the browser window so we expect to test against Desktop UI/UX rather than Mobile UI/UX
            @@setupComplete = true                                 # setupComplete is now true as we've loaded up everything we need for our tests
        end
      end
    
      def teardown                                                 # Minitest#teardown runs after every #test method
        if (@@testsRun == CoolTests.runnable_methods.length)   # if we've run all the tests in the suite we are finished and can then close the browser
            @@driver.quit
        end
      end
    
      #Tests
    
      def test_one
        p __method__
        @@driver.goto('www.google.com')
        assert_equal 'Google', @@driver.title, 'browser should be at google.com'
      end
    
      def test_two
        p __method__
        @@driver.goto('www.bing.com')
        assert_equal 'Bing', @@driver.title, 'browser should be at bing.com'
      end
    

    【讨论】:

      猜你喜欢
      • 2015-12-20
      • 2015-04-20
      • 2016-12-04
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多