SlideShare a Scribd company logo
Real Life Cross-Platform Testing
Peter Edwards
peter@dragonstaff.co.uk


MiltonKeynes.pm
Perl Technical Talk
8th July 2008




                                               1
      Real Life Cross-Platform Testing   12/22/12
Contents
 Background aka      "Real Life"
 Cross-Platform
 Testing

 Add Windows Testing Under Unix
 Test::MockObject
 Test::MockModule
 Running Unix unit tests under Windows
 Future Plans For Testing
 Summary and Links



                                                  2
Real Life Cross-Platform Testing          12/22/12
Background aka "Real Life"
Content Management System used at BBC to enter XML documents
  that are later transformed to make public websites
   Client-side
     –   GUI using WxPerl (WxWidgets)
     –   WYSIWYG editing
     –   Talks SOAP over HTTP to server
     –   Runs under ActiveState Perl
   Server-side
     –   Handles SOAP requests
     –   Stores document blobs in filesystem
     –   Stores indexes, metadata in Oracle database
     –   Runs under Solaris Perl
   Usage
     – 100s of users
     – Time critical publishing : failure during release is not an option
                                                                               3
Real Life Cross-Platform Testing                                       12/22/12
Cross-Platform
CMS code running on Windows and Solaris
   Solaris perl 5.8.8
     $ perl -V
     Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
      Platform:
        osname=solaris, osvers=2.10, archname=sun4-solaris

   Windows ASPerl 5.8
     C:WINNT>perl –V
     Summary of my perl5 (revision 5 version 8 subversion 6) configuration:
      Platform:
       osname=MSWin32, osvers=4.0, archname=MSWin32-x86-multi-thread


                                                                           4
Real Life Cross-Platform Testing                                   12/22/12
Testing
 Unit tests for dev
 Automated overnight smoke testing of unit tests
 Dev / Staging Test / Live environments
 Manual release test on staging test area using
  Windows app
Problems
 Lots of tests for server side code, very few for
  client side because difficult to run 'use Wx' code
  on Unix in batch
 Existing tests run on Unix, fail on Windows


                                                      5
Real Life Cross-Platform Testing              12/22/12
Add Windows Testing Under Unix
Need to write lots of client-side tests for
1)   GUI
       WxPerl -> Gtk+ under Solaris
         ‘Use Wx’ was failing because no X display
         Problems with font sizing and window alignment
         Windows-specific components, e.g. ActiveX Altova editor
     Installation
         Shortcuts, registry Win32::OLE, unzipping archives to Windows Apps dir etc.
Solutions
1)    Use Xvfb
         $ alias runxvfb='Xvfb :10 -dev vfb screen 0 1152x900x8 > /dev/null 2>&1 &'
         Lets you check code compile and call many routines
         But how do you test UI rendered properly - interpreting the virtual screen
               bitmaps is too hard!
1)    Sandboxing and mocking
         Mock required Win32 functions
         Make them do file I/O to a sandbox area
         Test::MockObject - Perl extension for emulating troublesome interfaces
         Test::MockModule - Override subroutines in a module for unit testing
                                                                                   6
Real Life Cross-Platform Testing                                           12/22/12
Test::MockObject 1
     Helpers

    sub make_mock_obj_in_class {
      my $class = shift;
      my $obj = Test::MockObject->new;
      $obj->fake_module($class);
      $obj->fake_new($class);
      return $obj;
    }

    sub dump_mock_calls {
      my $mockobj = shift;
      my $i = 1;
      while ( my $name = $mockobj->call_pos($i) ) {
         diag " call $i: $name";
         my @args = $mockobj->call_args($i);
         for (0 .. $#args) {
            diag ' arg '.($_ +1).': ';
            diag Dumper($args[$_]);
         }
         $i++;
      }
    }




                                                              7
Real Life Cross-Platform Testing                      12/22/12
Test::MockObject 2
      Mocking

    my $wx = make_mock_obj_in_class( 'Wx' );

    my $mock_WxPerlSplashProgress = make_mock_obj_in_class( 'Wx::Perl::SplashProgress' );
    $mock_WxPerlSplashProgress->set_true(qw( SetLabelColour SetIcon Show SetValue Update Destroy ));
    $mock_WxPerlSplashProgress->mock( SetLabel => sub { diag ' SetLabel: '.$_[1] } );

    $mock_Win32OLE = make_mock_obj_in_class( 'Win32::OLE' );
    $mock_Win32OLE->mock( 'SpecialFolders', sub { shift } );
    $mock_Win32OLE->mock( 'AppData', sub { return catdir(qw(data win32), 'Application Data') } );
    $mock_Win32OLE->mock( 'StartMenu', sub { catdir(qw(data win32 startmenu)) } );
    $mock_Win32OLE->mock( 'Desktop', sub { catdir(qw(data win32 desktop)) } );

    $mock_Win32Shortcut = make_mock_obj_in_class( 'Win32::Shortcut' );
    $mock_Win32Shortcut->mock( 'Load', sub {
       my ($self, $filename) = @_;
       $self->{content} = read_file($filename);
       return 1;
       } );
    $mock_Win32Shortcut->mock( 'Path', sub {
       my ($self, $path) = @_;
       $self->{content} = $path;
       } );
    $mock_Win32Shortcut->mock( 'Arguments', sub {
       my ($self, $args) = @_;
       $self->{content} .= ' '.$args . "rn";
       } );
    $mock_Win32Shortcut->mock( 'Save', sub {
       my ($self, $filename) = @_;
       write_file($filename, $self->{content} . "writetime ". gmtime() . "rn");
       return 1;
       } );
    $mock_Win32Shortcut->set_true(qw( ShowCmd Description IconLocation Close ));
    { no strict 'refs'; *{'Win32::Shortcut::SW_SHOWMINNOACTIVE'} = sub {}; }



                                                                                                               8
Real Life Cross-Platform Testing                                                                       12/22/12
Test::MockObject 3
   Testing
$mock_WxPerlSplashProgress->clear();
is( $i->_install_loginscript, 1, '$i->_install_loginscript' );
dump_mock_calls($mock_IFLDesktopLoginScript);
$mock_IFLDesktopLoginScript->called_pos_ok( 3, 'install', 'called
    IFL::Desktop::LoginScript->install' );
dump_mock_calls($mock_WxPerlSplashProgress);
$mock_WxPerlSplashProgress->called_pos_ok( 4, 'SetLabel', 'called
    Wx::Perl::SplashProgress->SetLabel' );
$mock_WxPerlSplashProgress->called_args_pos_is( 4, 2, 'Checking
    login script' );
$mock_WxPerlSplashProgress->called_pos_ok( 7, 'SetLabel', 'called
    Wx::Perl::SplashProgress->SetLabel' );
$mock_WxPerlSplashProgress->called_args_pos_is( 7, 2, 'Installing
    login script...' );



                                                                   9
Real Life Cross-Platform Testing                           12/22/12
Test::MockModule 1
   Helper
sub mock_module {
    my ($module,$options,@functions) = @_;

    my $no_auto = defined($options->{no_auto}) ? $options->{no_auto} : 1;
    my $create_new = defined($options->{create_new}) ? $options->{create_new} : 1;
    my $testmockmodule = new Test::MockModule($module, no_auto => $no_auto);

    my $object;
    if ($create_new) {
       $object = bless {}, $module;
       $testmockmodule->mock('new',sub { $logger->log($module,'new',@_); return $object });
    }

    for my $function (@functions) {
       $testmockmodule->mock($function,sub { $logger->log($module,$function,@_) });
    }

    no strict 'refs';
    push @{$module . "::ISA"},'Exporter';

    my $module_path = $module;
    $module_path =~ s{::}{/}xmsg;
    $module_path .= '.pm';
    $INC{$module_path} = "1 (Inserted by mock_module())";

    return $testmockmodule, $object;
}

                                                                                                     10
Real Life Cross-Platform Testing                                                              12/22/12
Test::MockModule 2
   Mocking
     my ($mock_wx_activex_ie, $mock_wx_activex_ie_object)
         = mock_module('Wx::ActiveX::IE',{});
     my ($mock_wx_activex_event, $mock_wx_activex_event_object)
         = mock_module('Wx::ActiveX::Event',{},@Wx::Event::EXPORT_OK);
     my ($mock_wx_panel,$mock_wx_panel_object)
         = mock_module('Wx::Panel',{}, qw( SetSizer ));
     my ($mock_wx_boxsizer,$mock_wx_boxsizer_object)
         = mock_module('Wx::BoxSizer',{}, qw( Add ));

   Tests - use your objects as normal… then check call sequence
     my @mf_calls = $logger->filter({'FLIPClient::UI::MicroForms' => []});
     my $call = shift(@mf_calls);
     is($call->{function},'set_template','position_change (' . $test->{name} . ') calls set_template');
     ok($call->{args}->[1] =~ $test->{template},'position_change (' . $test->{name} . ') sets
         template');

     $call = shift(@mf_calls);
     is($call->{function},'set_data','position_change (' . $test->{name} . ') calls set_data');
     is_deeply($call->{args}->[1],$test->{data},'position_change (' . $test->{name} . ') sets data');




                                                                                                   11
Real Life Cross-Platform Testing                                                            12/22/12
Running Unix unit tests under Windows 1

   Some libraries shared between Unix and Windows;
    not being tested properly client-side
   Perl Portability
    – "perldoc perlport“ http://perldoc.perl.org/5.8.8/perlport.html
      "When the code will run on only two or three operating systems,
      you may need to consider only the differences of those particular
      systems. The important thing is to decide where the code will run
      and to be deliberate in your decision.“
    – Only worrying about Windows and Unix; OpenVMS support is
      hard
           binmode and chomp - binmode saves headaches on Windows like
            EOF ^Z; watch out for CR-LF
           use File::Spec::Functions rather than Unix paths
              YES : my $path = rel2abs( catdir(qw( data local cache file.txt ));
              NO : my $path = './data/local/cache/file.txt';

                                                                                    12
Real Life Cross-Platform Testing                                             12/22/12
Running Unix unit tests under Windows 2
   Generic configuration interface with platform-specific subclasses
          System.pm
               |-- System/Win32.pm
               |-- System/Unix.pm
          using File::Spec::Functions for paths
   Change tests from path strings to regexes using a quote path
    separator
           my $script = $i->startup('remote');
     NO : is( $script, 'scripts/FLIP_real.PL', '$i->startup("remote") script’
     YES : $ps = ($^O eq 'MSWin32') ? "" : '/';
           $qps = quotemeta $ps;
           like( $script, qr{ scripts [$qps] FLIP_real.pl z }xms, '$i-
       >startup("remote") script' );
     Note PBP style regex
   Actually run the tests on multiple platforms


                                                                               13
Real Life Cross-Platform Testing                                        12/22/12
Future Plans For Testing
 Automate      application release test under
   Windows
    – Win32::GuiTest (or pay for WinRunner)




                                                  14
Real Life Cross-Platform Testing           12/22/12
Summary and Links
   Summary
    –   "perldoc perlport“
    –   Write cross-platform tests from the outset; convert old ones
    –   Mock platform-specific GUI or system library calls
    –   Automate tests (life is short) and get as much coverage as
        possible

   Links
    – WxPerl http://wxperl.sourceforge.net/
    – WxWidgets http://docs.wxwidgets.org/trunk/
    – "Perl Testing: A Developer's Notebook" Ian Langworth &
      chromatic, O'Reilly Media, Inc., 2005
      http://preview.tinyurl.com/5k6wnc

Thank you. Any Questions?

                                                                       15
Real Life Cross-Platform Testing                                12/22/12

More Related Content

PDF
Redux for ReactJS Programmers
KEY
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
ODP
Android Nâng cao-Bài 9-Debug in Android Application Development
PDF
JS and patterns
PDF
JDK Power Tools
PDF
How Does Kubernetes Build OpenAPI Specifications?
PDF
Testing Backbone applications with Jasmine
PPTX
Testing microservices: Tools and Frameworks
Redux for ReactJS Programmers
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Android Nâng cao-Bài 9-Debug in Android Application Development
JS and patterns
JDK Power Tools
How Does Kubernetes Build OpenAPI Specifications?
Testing Backbone applications with Jasmine
Testing microservices: Tools and Frameworks

What's hot (20)

PDF
Custom deployments with sbt-native-packager
PPTX
Java script for web developer
PDF
droidparts
PDF
Design Patterns Reconsidered
PDF
Dependency Injection in PHP
PDF
GeeCON 2017 - TestContainers. Integration testing without the hassle
PDF
Testing with Node.js
DOCX
Exercícios Netbeans - Vera Cymbron
PDF
«Objective-C Runtime в примерах» — Алексей Сторожев, e-Legion
PPT
Mastering Java ByteCode
PDF
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
PDF
Clojure - A new Lisp
PDF
meet.js - QooXDoo
PDF
Construire une application JavaFX 8 avec gradle
PDF
Building stable testing by isolating network layer
PDF
#JavaFX.forReal() - ElsassJUG
PPTX
Mastering Java Bytecode With ASM - 33rd degree, 2012
PDF
Java Bytecode for Discriminating Developers - JavaZone 2011
PPTX
Android Unit Test
Custom deployments with sbt-native-packager
Java script for web developer
droidparts
Design Patterns Reconsidered
Dependency Injection in PHP
GeeCON 2017 - TestContainers. Integration testing without the hassle
Testing with Node.js
Exercícios Netbeans - Vera Cymbron
«Objective-C Runtime в примерах» — Алексей Сторожев, e-Legion
Mastering Java ByteCode
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Clojure - A new Lisp
meet.js - QooXDoo
Construire une application JavaFX 8 avec gradle
Building stable testing by isolating network layer
#JavaFX.forReal() - ElsassJUG
Mastering Java Bytecode With ASM - 33rd degree, 2012
Java Bytecode for Discriminating Developers - JavaZone 2011
Android Unit Test
Ad

Viewers also liked (9)

DOC
Installation instructions p8p bb bridge
PDF
экслибрис текст
PDF
World contemporary screen
PDF
Sbrf on-line manual
PDF
экслибрис иллюстрации
PPTX
BBC World Service Twitter OAuth Perl
ZIP
Rti implementation
PDF
дневники суточного мониторирования
PPT
Lotoshino
Installation instructions p8p bb bridge
экслибрис текст
World contemporary screen
Sbrf on-line manual
экслибрис иллюстрации
BBC World Service Twitter OAuth Perl
Rti implementation
дневники суточного мониторирования
Lotoshino
Ad

Similar to Real world cross-platform testing (20)

PDF
Os Wilhelm
ODP
30 Minutes To CPAN
PDF
Modern Perl desktop apps - Cluj.pm March 2014
PDF
Integration Testing Practice using Perl
KEY
Perl 5.16 and beyond
PDF
Continuing Evolution of Perl: Highlights of ActivePerl 5.14
KEY
Le PERL est mort
PDF
O CPAN tem as ferramentas que você precisa para fazer TDD em Perl, o Coding D...
PDF
WEB PROGRAMMING UNIT V BY BHAVSINGH MALOTH
PDF
PHP, Cloud And Microsoft Symfony Live 2010
PDF
How could I automate log gathering in the distributed system
PDF
Packaging perl (LPW2010)
PDF
Perl Testing Consideration (seen from other languages)
PDF
Intro to PHP Testing
PDF
The $path to knowledge: What little it take to unit-test Perl.
PDF
System Programming and Administration
PDF
ActiveState, CA, Taking quality products to market faster with enterprise rea...
PDF
Enterprise Perl
PDF
CPAN 模組二三事
KEY
Os Wilhelm
30 Minutes To CPAN
Modern Perl desktop apps - Cluj.pm March 2014
Integration Testing Practice using Perl
Perl 5.16 and beyond
Continuing Evolution of Perl: Highlights of ActivePerl 5.14
Le PERL est mort
O CPAN tem as ferramentas que você precisa para fazer TDD em Perl, o Coding D...
WEB PROGRAMMING UNIT V BY BHAVSINGH MALOTH
PHP, Cloud And Microsoft Symfony Live 2010
How could I automate log gathering in the distributed system
Packaging perl (LPW2010)
Perl Testing Consideration (seen from other languages)
Intro to PHP Testing
The $path to knowledge: What little it take to unit-test Perl.
System Programming and Administration
ActiveState, CA, Taking quality products to market faster with enterprise rea...
Enterprise Perl
CPAN 模組二三事

More from Peter Edwards (7)

PPTX
Enhancing engagement through content
PPTX
Twitter oauth
ODP
Perl exceptions lightning talk
PPT
Role based access control
PPT
Getting started with Catalyst and extjs
PPT
Desperately seeking a lightweight Perl framework
PPT
Open Source for Government - PSEICT Conference - British Council Case Study u...
Enhancing engagement through content
Twitter oauth
Perl exceptions lightning talk
Role based access control
Getting started with Catalyst and extjs
Desperately seeking a lightweight Perl framework
Open Source for Government - PSEICT Conference - British Council Case Study u...

Recently uploaded (20)

PDF
Encapsulation theory and applications.pdf
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Getting Started with Data Integration: FME Form 101
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
cloud_computing_Infrastucture_as_cloud_p
PPTX
1. Introduction to Computer Programming.pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
A comparative study of natural language inference in Swahili using monolingua...
PPTX
Tartificialntelligence_presentation.pptx
PPTX
OMC Textile Division Presentation 2021.pptx
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Encapsulation theory and applications.pdf
NewMind AI Weekly Chronicles - August'25-Week II
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Unlocking AI with Model Context Protocol (MCP)
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Getting Started with Data Integration: FME Form 101
Network Security Unit 5.pdf for BCA BBA.
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
cloud_computing_Infrastucture_as_cloud_p
1. Introduction to Computer Programming.pptx
Machine learning based COVID-19 study performance prediction
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
A comparative study of natural language inference in Swahili using monolingua...
Tartificialntelligence_presentation.pptx
OMC Textile Division Presentation 2021.pptx
Empathic Computing: Creating Shared Understanding
Programs and apps: productivity, graphics, security and other tools
Encapsulation_ Review paper, used for researhc scholars
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf

Real world cross-platform testing

  • 1. Real Life Cross-Platform Testing Peter Edwards [email protected] MiltonKeynes.pm Perl Technical Talk 8th July 2008 1 Real Life Cross-Platform Testing 12/22/12
  • 2. Contents  Background aka "Real Life"  Cross-Platform  Testing  Add Windows Testing Under Unix  Test::MockObject  Test::MockModule  Running Unix unit tests under Windows  Future Plans For Testing  Summary and Links 2 Real Life Cross-Platform Testing 12/22/12
  • 3. Background aka "Real Life" Content Management System used at BBC to enter XML documents that are later transformed to make public websites  Client-side – GUI using WxPerl (WxWidgets) – WYSIWYG editing – Talks SOAP over HTTP to server – Runs under ActiveState Perl  Server-side – Handles SOAP requests – Stores document blobs in filesystem – Stores indexes, metadata in Oracle database – Runs under Solaris Perl  Usage – 100s of users – Time critical publishing : failure during release is not an option 3 Real Life Cross-Platform Testing 12/22/12
  • 4. Cross-Platform CMS code running on Windows and Solaris  Solaris perl 5.8.8 $ perl -V Summary of my perl5 (revision 5 version 8 subversion 8) configuration: Platform: osname=solaris, osvers=2.10, archname=sun4-solaris  Windows ASPerl 5.8 C:WINNT>perl –V Summary of my perl5 (revision 5 version 8 subversion 6) configuration: Platform: osname=MSWin32, osvers=4.0, archname=MSWin32-x86-multi-thread 4 Real Life Cross-Platform Testing 12/22/12
  • 5. Testing  Unit tests for dev  Automated overnight smoke testing of unit tests  Dev / Staging Test / Live environments  Manual release test on staging test area using Windows app Problems  Lots of tests for server side code, very few for client side because difficult to run 'use Wx' code on Unix in batch  Existing tests run on Unix, fail on Windows 5 Real Life Cross-Platform Testing 12/22/12
  • 6. Add Windows Testing Under Unix Need to write lots of client-side tests for 1) GUI WxPerl -> Gtk+ under Solaris ‘Use Wx’ was failing because no X display Problems with font sizing and window alignment Windows-specific components, e.g. ActiveX Altova editor  Installation Shortcuts, registry Win32::OLE, unzipping archives to Windows Apps dir etc. Solutions 1) Use Xvfb $ alias runxvfb='Xvfb :10 -dev vfb screen 0 1152x900x8 > /dev/null 2>&1 &' Lets you check code compile and call many routines But how do you test UI rendered properly - interpreting the virtual screen bitmaps is too hard! 1) Sandboxing and mocking Mock required Win32 functions Make them do file I/O to a sandbox area Test::MockObject - Perl extension for emulating troublesome interfaces Test::MockModule - Override subroutines in a module for unit testing 6 Real Life Cross-Platform Testing 12/22/12
  • 7. Test::MockObject 1  Helpers sub make_mock_obj_in_class { my $class = shift; my $obj = Test::MockObject->new; $obj->fake_module($class); $obj->fake_new($class); return $obj; } sub dump_mock_calls { my $mockobj = shift; my $i = 1; while ( my $name = $mockobj->call_pos($i) ) { diag " call $i: $name"; my @args = $mockobj->call_args($i); for (0 .. $#args) { diag ' arg '.($_ +1).': '; diag Dumper($args[$_]); } $i++; } } 7 Real Life Cross-Platform Testing 12/22/12
  • 8. Test::MockObject 2  Mocking my $wx = make_mock_obj_in_class( 'Wx' ); my $mock_WxPerlSplashProgress = make_mock_obj_in_class( 'Wx::Perl::SplashProgress' ); $mock_WxPerlSplashProgress->set_true(qw( SetLabelColour SetIcon Show SetValue Update Destroy )); $mock_WxPerlSplashProgress->mock( SetLabel => sub { diag ' SetLabel: '.$_[1] } ); $mock_Win32OLE = make_mock_obj_in_class( 'Win32::OLE' ); $mock_Win32OLE->mock( 'SpecialFolders', sub { shift } ); $mock_Win32OLE->mock( 'AppData', sub { return catdir(qw(data win32), 'Application Data') } ); $mock_Win32OLE->mock( 'StartMenu', sub { catdir(qw(data win32 startmenu)) } ); $mock_Win32OLE->mock( 'Desktop', sub { catdir(qw(data win32 desktop)) } ); $mock_Win32Shortcut = make_mock_obj_in_class( 'Win32::Shortcut' ); $mock_Win32Shortcut->mock( 'Load', sub { my ($self, $filename) = @_; $self->{content} = read_file($filename); return 1; } ); $mock_Win32Shortcut->mock( 'Path', sub { my ($self, $path) = @_; $self->{content} = $path; } ); $mock_Win32Shortcut->mock( 'Arguments', sub { my ($self, $args) = @_; $self->{content} .= ' '.$args . "rn"; } ); $mock_Win32Shortcut->mock( 'Save', sub { my ($self, $filename) = @_; write_file($filename, $self->{content} . "writetime ". gmtime() . "rn"); return 1; } ); $mock_Win32Shortcut->set_true(qw( ShowCmd Description IconLocation Close )); { no strict 'refs'; *{'Win32::Shortcut::SW_SHOWMINNOACTIVE'} = sub {}; } 8 Real Life Cross-Platform Testing 12/22/12
  • 9. Test::MockObject 3  Testing $mock_WxPerlSplashProgress->clear(); is( $i->_install_loginscript, 1, '$i->_install_loginscript' ); dump_mock_calls($mock_IFLDesktopLoginScript); $mock_IFLDesktopLoginScript->called_pos_ok( 3, 'install', 'called IFL::Desktop::LoginScript->install' ); dump_mock_calls($mock_WxPerlSplashProgress); $mock_WxPerlSplashProgress->called_pos_ok( 4, 'SetLabel', 'called Wx::Perl::SplashProgress->SetLabel' ); $mock_WxPerlSplashProgress->called_args_pos_is( 4, 2, 'Checking login script' ); $mock_WxPerlSplashProgress->called_pos_ok( 7, 'SetLabel', 'called Wx::Perl::SplashProgress->SetLabel' ); $mock_WxPerlSplashProgress->called_args_pos_is( 7, 2, 'Installing login script...' ); 9 Real Life Cross-Platform Testing 12/22/12
  • 10. Test::MockModule 1  Helper sub mock_module { my ($module,$options,@functions) = @_; my $no_auto = defined($options->{no_auto}) ? $options->{no_auto} : 1; my $create_new = defined($options->{create_new}) ? $options->{create_new} : 1; my $testmockmodule = new Test::MockModule($module, no_auto => $no_auto); my $object; if ($create_new) { $object = bless {}, $module; $testmockmodule->mock('new',sub { $logger->log($module,'new',@_); return $object }); } for my $function (@functions) { $testmockmodule->mock($function,sub { $logger->log($module,$function,@_) }); } no strict 'refs'; push @{$module . "::ISA"},'Exporter'; my $module_path = $module; $module_path =~ s{::}{/}xmsg; $module_path .= '.pm'; $INC{$module_path} = "1 (Inserted by mock_module())"; return $testmockmodule, $object; } 10 Real Life Cross-Platform Testing 12/22/12
  • 11. Test::MockModule 2  Mocking my ($mock_wx_activex_ie, $mock_wx_activex_ie_object) = mock_module('Wx::ActiveX::IE',{}); my ($mock_wx_activex_event, $mock_wx_activex_event_object) = mock_module('Wx::ActiveX::Event',{},@Wx::Event::EXPORT_OK); my ($mock_wx_panel,$mock_wx_panel_object) = mock_module('Wx::Panel',{}, qw( SetSizer )); my ($mock_wx_boxsizer,$mock_wx_boxsizer_object) = mock_module('Wx::BoxSizer',{}, qw( Add ));  Tests - use your objects as normal… then check call sequence my @mf_calls = $logger->filter({'FLIPClient::UI::MicroForms' => []}); my $call = shift(@mf_calls); is($call->{function},'set_template','position_change (' . $test->{name} . ') calls set_template'); ok($call->{args}->[1] =~ $test->{template},'position_change (' . $test->{name} . ') sets template'); $call = shift(@mf_calls); is($call->{function},'set_data','position_change (' . $test->{name} . ') calls set_data'); is_deeply($call->{args}->[1],$test->{data},'position_change (' . $test->{name} . ') sets data'); 11 Real Life Cross-Platform Testing 12/22/12
  • 12. Running Unix unit tests under Windows 1  Some libraries shared between Unix and Windows; not being tested properly client-side  Perl Portability – "perldoc perlport“ http://perldoc.perl.org/5.8.8/perlport.html "When the code will run on only two or three operating systems, you may need to consider only the differences of those particular systems. The important thing is to decide where the code will run and to be deliberate in your decision.“ – Only worrying about Windows and Unix; OpenVMS support is hard  binmode and chomp - binmode saves headaches on Windows like EOF ^Z; watch out for CR-LF  use File::Spec::Functions rather than Unix paths YES : my $path = rel2abs( catdir(qw( data local cache file.txt )); NO : my $path = './data/local/cache/file.txt'; 12 Real Life Cross-Platform Testing 12/22/12
  • 13. Running Unix unit tests under Windows 2  Generic configuration interface with platform-specific subclasses System.pm |-- System/Win32.pm |-- System/Unix.pm using File::Spec::Functions for paths  Change tests from path strings to regexes using a quote path separator my $script = $i->startup('remote'); NO : is( $script, 'scripts/FLIP_real.PL', '$i->startup("remote") script’ YES : $ps = ($^O eq 'MSWin32') ? "" : '/'; $qps = quotemeta $ps; like( $script, qr{ scripts [$qps] FLIP_real.pl z }xms, '$i- >startup("remote") script' ); Note PBP style regex  Actually run the tests on multiple platforms 13 Real Life Cross-Platform Testing 12/22/12
  • 14. Future Plans For Testing  Automate application release test under Windows – Win32::GuiTest (or pay for WinRunner) 14 Real Life Cross-Platform Testing 12/22/12
  • 15. Summary and Links  Summary – "perldoc perlport“ – Write cross-platform tests from the outset; convert old ones – Mock platform-specific GUI or system library calls – Automate tests (life is short) and get as much coverage as possible  Links – WxPerl http://wxperl.sourceforge.net/ – WxWidgets http://docs.wxwidgets.org/trunk/ – "Perl Testing: A Developer's Notebook" Ian Langworth & chromatic, O'Reilly Media, Inc., 2005 http://preview.tinyurl.com/5k6wnc Thank you. Any Questions? 15 Real Life Cross-Platform Testing 12/22/12