Webdriver with Ruby and Minitest. Share test cases code between test suites - ruby

I need to share test code between a set of suites, but the thing is that I don't know how to define the test cases in the separate file so every other test suite can use the same test cases.
This is a sample of my files:
test_api.rb:
require_relative 'test_helper'
require 'rubygems'
require 'minitest/spec'
require 'minitest/autorun'
#require 'minitest/hell'
require 'uri'
require 'net/http'
require 'mysql2'
require 'json'
require 'digest/sha1'
require_relative 'cases_api_shared.rb'
class API_pc_qubit
#parallelize_me!
def setup
### DEFINITIONS
### URL
ENV['ws_url'] = 'http://.../'
### DATA DEFINITION (USERNAME, PASSWORD, ETC)
ENV['username'] = 'user'
ENV['password'] = 'pass'
### DEVICE = PC
ENV['APK_ID'] = "1"
ENV['APK_SECRET'] = "secret"
end
def test_user_create
# User registration test case
case_user_create
end
def test_user_login
# User login test case
case_user_login
end
def test_content_search
# Search for content test case
case_content_search
end
def test_utils_channels
# channels test case
case_utils_channels
end
def test_content_list
# Content list case
case_content_list
end
def test_user_modify
# Change user data test case
case_user_modify
end
def test_user_change_suscription
# Change user suscription test case
case_user_change_suscription
end
def test_user_favorite
# User profiles test case
case_user_favorite
end
def test_commercial_buyandplay
# Change user login password test case
case_commercial_buyandplay
end
#def test_content_status
#
# # Test content status currenttime test case
#
# case_content_status
#end
def teardown
end
end
And this is a sample of the cases_api_share.rb file:
require_relative 'obj_api_shared.rb'
def case_user_create
# User registration test case
case code...
end
def case_user_login
# User login test case
another test code...
end
And but when I run the suite, it didn't run the code in 'cases_api_share':
ruby tests/test_api.rb
Started with run options --seed 30622
Finished in 0.00055s
0 tests, 0 assertions, 0 failures, 0 errors, 0 skips

This is probably a duplicated. See here.
Based on that, here is an example.
If you want to group test, there is a easy way, just use autorun in the test files and require the test files in the suit.
#suit1.rb
require './test1.rb'
#suit2.rb
require './test1.rb'
require './test2.rb'
#test1.rb
require 'minitest/autorun'
class TestOne < MiniTest::Unit::TestCase
def test_one
assert_equal 1, 1
end
end
#test2.rb
require 'minitest/autorun'
class TestTwo < MiniTest::Unit::TestCase
def test_two
assert_equal 2, 2
end
end
You can run the suit or each test individually:
ruby suit1.rb
ruby suit2.rb
ruby test1.rb
ruby test2.rb
You can get the example code here

Related

How to write a Ruby (Minitest) unit test that fails if I don't have the correct require statements?

I have this test:
require 'minitest/autorun'
require 'minitest/color'
require_relative '../lib/util/input_file'
class TestInputFile < Minitest::Test
def setup
#input_path = Pathname.new("/path/to/inputs")
end
def test_default_input_file
input_file = Util::InputFile.new(1)
expected_path = #input_path.join('input01.txt')
assert_equal(expected_path, input_file.abspath)
end
# more tests follow
end
for this code:
module Util
class InputFile
def initialize(num)
#num = num
#input_dir = Pathname.new("/path/to/inputs")
end
def abspath
basename = 'input'
return #input_dir.join(format('%s%02d.txt', basename, #num))
end
end
end
When I run this with rake test, everything passes as expected; however, when I call it from my actual main script, it chokes with uninitialized constant Util::InputFile::Pathname (NameError). When I add require 'pathname' at the top of lib/util/input_file.rb, everything is fine.
Why does the unit test not fail in the same way, and how can I refactor it such that it will fail unless I have the correct require statement in the production code?
EDIT: Rakefile is as follows:
require 'minitest/test_task'
Minitest::TestTask.create do |t|
t.test_globs = ['test/**/test*.rb']
end
To run tests separately use rake test:isolated instead of rake test.
https://github.com/minitest/minitest#rake-tasks-
It seems like one of your other tests gets Pathname loaded.
How does your Rakefile look and doesn't it get pathname required? It can explain why your test (started with rake test) goes well.
And why don't you want to require pathname at the top of lib/util/input_file.rb?

How to create HTML test report with Ruby by using test-unit-runner-html

I am working on Ruby with Selenium and Watir. I have implemented Test-Unit, now I have a need to implement HTML Test Report. I have gone through test-unit-runner-html, but not so lucky. Can somebody help me implementing test-unit-runner-html with my project. Suppose there is a suite containing different test cases and I have to implement on it. Here is the sample test suite:
require 'rubygems'
gem 'test-unit'
require 'test-unit'
require 'test/unit/runner/html'
class TestExample < Test::Unit::TestCase
def setup
puts "running the setup........."
#number1 = 4
#number2 = 2
end
def test_add
puts "asserting the add function: "
numb1=#number1+#number2
assert_equal(7, numb1 + 1, "added correctly")
end
def test_sub
puts "asserting the subtract function"
numb2=#number1-#number2
assert_equal(2, numb2 - 0, "subtracted correctly")
end
def teardown
puts "running teardown......."
#number = nil
end
end

Minitest - Tests Don't Run - No Rails

I'm just starting a small project to emulate a Carnival's ticket sales booth and one of the guidelines was to test that a user can enter the number of tickets. The program runs in the console and I eventually (hopefully) figured it out how to implement this test thanks to #Stefan's answer on this question.
The problem is that now, when I run the test file, minitest says:
0 runs, 0 assertions, 0 failures, 0 errors, 0 skips
I get the same result when I try to run the test by name using ruby path/to/test/file.rb --name method-name. I'm not sure if this is because my code is still faulty of if it's because I've set up minitest incorrectly. I've tried to look up similar problems on SO but most questions seem to involve using minitest with rails and I just have a plain ruby project.
Here's my test file:
gem 'minitest', '>= 5.0.0'
require 'minitest/spec'
require 'minitest/autorun'
require_relative 'carnival'
class CarnivalTest < MiniTest::Test
def sample
assert_equal(1, 1)
end
def user_can_enter_number_of_tickets
with_stdin do |user|
user.puts "2"
assert_equal(Carnival.new.get_value, "2")
end
end
def with_stdin
stdin = $stdin # global var to remember $stdin
$stdin, write = IO.pipe # assign 'read end' of pipe to $stdin
yield write # pass 'write end' to block
ensure
write.close # close pipe
$stdin = stdin # restore $stdin
end
end
In a file called carnival.rb in the same folder as my test file I have
Class Carnival
def get_value
gets.chomp
end
end
If anyone can help figure out why the test is not running I'd be grateful!
By convention, tests in Minitest are public instance methods that start with test_, so the original test has no actual test methods. You need to update your test class so that the methods with assertions follow the convention as:
class CarnivalTest < Minitest::Test
def test_sample
assert_equal(1, 1)
end
def test_user_can_enter_number_of_tickets
with_stdin do |user|
user.puts "2"
assert_equal(Carnival.new.get_value, "2")
end
end
# snip...
end
Yeah always start all your tests with test_ so it knows that you want to that function/method
class CarnivalTest < MiniTest::Test
def test_sample
assert_equal(1, 1)
end
def test_user_can_enter_number_of_tickets
with_stdin do |user|
user.puts "2"
assert_equal(Carnival.new.get_value, "2")
end
end
and that should work for you

Ruby Watir can't find the assert method outside of the running class?

I have a class that I want to use in many test cases:
require 'rubygems'
require 'test/unit'
require 'watir'
class Tests < Test::Unit::TestCase
def self.Run(browser)
# make sure Summary of Changes exists
assert( browser.table(:class, "summary_table_class").exists? )
# make sure Snapshot of Change Areas exists
assert( browser.image(:xpath, "//div[#id='report_chart_div']/img").exists? )
# make sure Integrated Changes table exists
assert( browser.table(:id, 'change_table_html').exists? )
end
end
However, when run in one of my test cases:
require 'rubygems'
require 'test/unit'
require 'watir'
require 'configuration'
require 'Tests'
class TwoSCMCrossBranch < Test::Unit::TestCase
def test_two_scm_cross_branch
test_site = Constants.whatsInUrl
puts " Step 1: go to the test site: " + test_site
ie = Watir::IE.start(test_site)
Tests.Run(ie)
end
end
I get the error:
NoMethodError: undefined method `assert' for Tests:Class
C:/p4/dev/webToolKit/test/webapps/WhatsIn/ruby-tests/Tests.rb:8:in `Run'
What's missing? Thanks!
assert() is an instance method on TestCase so would only be available to instances of Tests. You are calling it inside a class method so Ruby is looking for a class method in Tests which doesn't exist.
A better way to do this is to make Tests a module and the Run method an instance method:
module Tests
def Run(browser)
...
end
end
Then include the Tests module in your test class:
class TwoSCMCrossBranch < Test::Unit::TestCase
include Tests
def test_two_scm_cross_branch
test_site = Constants.whatsInUrl
puts " Step 1: go to the test site: " + test_site
ie = Watir::IE.start(test_site)
Run(ie)
end
end
which will make the Run method available to the test and Run() will find the assert() method in the test class.
It might be worth a try to remove the asserts all together, and just use .exists?.

Webrat Mechanize outside of Rails

I'm trying to use Webrat in a standalone script to automate some web browsing. How do I get the assert_contain method to work?
require 'rubygems'
require 'webrat'
include Webrat::Methods
include Webrat::Matchers
Webrat.configure do |config|
config.mode = :mechanize
end
visit 'http://gmail.com'
assert_contain 'Welcome to Gmail'
I get this error
/usr/lib/ruby/gems/1.8/gems/webrat-0.6.0/lib/webrat/core/matchers/have_content.rb:57:in 'assert_contain': undefined method assert' for #<Object:0xb7e01958> (NoMethodError)
assert_contain and other assertions are methods of test/unit, try to require it and use webrat from inside a test method:
require 'test/unit'
class TC_MyTest < Test::Unit::TestCase
def test_fail
assert(false, 'Assertion was false.')
end
end
anyway i haven't tested it but I have a working spec_helper for rspec if this can interest you:
require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
require 'spec/rails'
require "webrat"
Webrat.configure do |config|
config.mode = :rails
end
module Spec::Rails::Example
class IntegrationExampleGroup < ActionController::IntegrationTest
def initialize(defined_description, options={}, &implementation)
defined_description.instance_eval do
def to_s
self
end
end
super(defined_description)
end
Spec::Example::ExampleGroupFactory.register(:integration, self)
end
end
plus a spec:
# remember to require the spec helper
describe "Your Context" do
it "should GET /url" do
visit "/url"
body.should =~ /some text/
end
end
give it a try I found it very useful (more than cucumber and the other vegetables around) when there is no need to Text specs (features) instead of Code specs, that I like the most.
ps you need the rspec gem and it installs the 'spec' command to execute your specs.

Resources