Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reset iOS app in calabash-ios

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

like image 349
Mesh Avatar asked Jun 30 '14 15:06

Mesh


1 Answers

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.

like image 80
jmoody Avatar answered Nov 03 '22 20:11

jmoody