... a little rspec(t) for Qlikview

In the past I've been asked to test a complex Qlikview Project with lots of variables, events and macros.
Manual testing was becoming too complex and boring, so I helped adding a bit of rspec to the mix.
I've been using rspec to test almost everything in the past few years and this was an intriguing new testing challenge.

Step 0 - install the tools
  • install Qlikview Desktop 11
  • install ruby (my swiss-army integration tool of choice)
  • install bundler gem install bundler
  • create the project folder mkdir rspec_for_qlik
  • create a file named Gemfile into the project folder with the following content:
source 'https://rubygems.org'

gem 'ruby-ole'

group :development, :test do  
  gem 'rspec'
end
  • install all the dependencies cd rspec_for_qlik && bundle install
  • create the project directories mkdir src && mkdir lib && mkdir spec
Step 1 - build a small automation lib

Before even starting to build the actual tests, I wrote a small DRY library.
It's very easy to integrate win32 ole api with ruby (and even more easily java libraries with jruby indeed) as you can see in the following example:

# coding: utf-8
require 'win32ole'

class QlikDoc < Object
  attr_accessor :qv_app, :qv_doc

public
  def init()
    @qv_app = WIN32OLE.new("QlikTech.QlikView")
  end

  def open_doc(file_path)
    @qv_doc = qv_app.openDoc(file_path)
  end

  def close_doc()
    @qv_doc.closeDoc()
  end

  def quit()
    @qv_app.quit()
  end

  def set_variable(variable_name, variable_value)
    qv_variable = @qv_doc.Variables(variable_name)
    qv_variable.SetContent(variable_value, true)
  end

  def get_variable(variable_name)
    qv_variable = @qv_doc.Variables(variable_name)
    qv_variable.GetContent.String
  end

  def set_selection(field_name, field_value)
    @qv_doc.Fields(field_name).Select(field_value)
  end

  def clear_selection(field_name)
    @qv_doc.Fields(field_name).Clear
  end

  def press_button(object_id)
    qv_button=@qv_doc.GetSheetObject(object_id)
    qv_button.press   
  end
end

save the example above in a file called lib\qlik_doc.rb

step 2 - setup a simple test

Let's create our first test.
First of all create or copy the qvw file you want to test in src\testbed.qvw.
n.b. in order to pass the test, the testbed.qvw file must contain a variable named testbed_variable

Next create a rspec test in spec\qlik_spec.rb with the following content:

# coding: utf-8
require './lib/qlik_doc'

RSpec.describe QlikDoc, :type => :model do  
  before(:all) do
    @q = QlikDoc.new
    @q.init()
  end

  before(:each) do
    @q.open_doc("#{Dir.pwd}/src/testbed.qvw") 
  end

  it "should set and read a variable named testbed_variable" do
      @q.set_variable('testbed_variable','successful')
      expect(@q.get_variable('testbed_variable')).to eq('successful')
  end

  after(:each) do
    @q.close_doc()
  end  

  after(:all) do
    @q.quit()
  end

end
step 3 - run the test!

To run the test and check the result it's a matter of typying rspec.
The output should be

Finished in 2.98 seconds (files took 0.45292 seconds to load)
1 example, 0 failures
Post Scriptum

All the files above are available in github
In the git project there is no testbed.qvw file. You will find, instead, a folder called testbed-prj, containing the "xml" content of the original file. In order to create the correct testbed.qvw file, just create a new and empty qvw file named testbed.qvw, open it and save it (under the hood, Qlikview will load the content from the testbed-pro folder...).