Reset iOS app in calabash-ios

前端 未结 1 799
耶瑟儿~
耶瑟儿~ 2020-12-19 11:08

How to change code in hooks to reset (iOS) app at specific scenario ? means only to those scenario where tags mention as @reset

相关标签:
1条回答
  • 2020-12-19 11:13

    https://github.com/cucumber/cucumber/wiki/Hooks#tagged-hooks

    UPDATED for Calabash 0.17 and run-loop 2.0.2

    This project contains an example of how to use Cucumber tags and Before hooks to re-install apps and clear application data on simulators and devices.

    https://github.com/calabash/ios-smoke-test-app/

    In particular, see these two files:

    • ideviceinstaller wrapper
    • support/01_launch.rb

    I won't reproduce the entire 01_launch.rb example here, but here are the hooks:

    Before("@no_relaunch") do
      @no_relaunch = true
    end
    
    Before('@reset_app_btw_scenarios') do
      if xamarin_test_cloud? || LaunchControl.target_is_simulator?
        ENV['RESET_BETWEEN_SCENARIOS'] = '1'
      else
        LaunchControl.install_on_physical_device
      end
    end
    
    Before('@reset_device_settings') do
      if xamarin_test_cloud?
        ENV['RESET_BETWEEN_SCENARIOS'] = '1'
      elsif LaunchControl.target_is_simulator?
        target = LaunchControl.target
        instruments = RunLoop::Instruments.new
        xcode = instruments.xcode
        device = instruments.simulators.find do |sim|
          sim.udid == target || sim.instruments_identifier(xcode) == target
        end
    
        RunLoop::CoreSimulator.erase(device)
      else
        LaunchControl.install_on_physical_device
      end
    end
    
    Before do |scenario|
      launcher = LaunchControl.launcher
    
      options = {
        #:uia_strategy => :host
        #:uia_strategy => :shared_element
        :uia_strategy => :preferences
      }
    
      relaunch = true
    
      if @no_relaunch
        begin
          launcher.ping_app
          attach_options = options.dup
          attach_options[:timeout] = 1
          launcher.attach(attach_options)
          relaunch = launcher.device == nil
        rescue => e
          RunLoop.log_info2("Tag says: don't relaunch, but cannot attach to the app.")
          RunLoop.log_info2("#{e.class}: #{e.message}")
          RunLoop.log_info2("The app probably needs to be launched!")
        end
      end
    
      if relaunch
        launcher.relaunch(options)
        launcher.calabash_notify(self)
      end
    
      ENV['RESET_BETWEEN_SCENARIOS'] = '0'
    
      # Re-installing the app on a device does not clear the Keychain settings,
      # so we must clear them manually.
      if scenario.source_tag_names.include?('@reset_device_settings')
        if xamarin_test_cloud? || LaunchControl.target_is_physical_device?
          keychain_clear
        end
      end
    end
    

    The key is recognize the difference between testing on simulators and devices and testing on the Test Cloud and locally.

    You can reset the application settings and content before every Scenario using the RESET_BETWEEN_SCENARIOS env variable.

    $ RESET_BETWEEN_SCENARIOS=1 cucumber
    

    You can also implement a backdoor method to reset your app to a good known state. This example is a bit wonky and out of date, but I have used it to great effect in the past - it really speeds up tests - briar-ios-example You can do all kinds of things with backdoors: log users in/out, reset databases, wipe user preferences, add/remove files from the sandbox.

    0 讨论(0)
提交回复
热议问题