beyond unit testing

31
Steve Loughran Julio Guijarro HP Laboratories, Bristol, UK Beyond Unit Testing

Upload: steve-loughran

Post on 12-Nov-2014

1.821 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Beyond Unit Testing

Steve LoughranJulio Guijarro

HP Laboratories, Bristol, UK

Beyond Unit Testing

Page 2: Beyond Unit Testing

2

About Us

Julio GuijarroResearch scientist at HP Laboratories on

Grid-Scale Deployment

Leads the SmartFrog open source effort

Steve LoughranResearch scientist at HP Laboratories on

Grid-Scale DeploymentApache Ant & Axis committerCo-author of

Java Development with AntBehind schedule on the 2nd edition

Page 3: Beyond Unit Testing

two different distributed systems

Multi-tier webappCERN Large Hadron Collider

Page 4: Beyond Unit Testing

How do you show it works?

• Europe's high-end server farms

• Years of simulations

• Nobel Prize winners, Computer Scientists and physics PhD students

• An old laptop nobody wants

• Any spare time before you ship

• You

Page 5: Beyond Unit Testing

5

Classic unit tests

• Run in a test harness• Don’t stress the

system• Don’t run on real

servers• Don't run with real

data

Page 6: Beyond Unit Testing

6

Write less Unit Tests!

A modest proposal

Page 7: Beyond Unit Testing

7

Apply Formal Methods!

• Integrating Formal Methods with XP development.• How to use axiomatic theorem proofs to verify

correctness in a large-scale distributed system.• How Milner's π-calculus is the underpinnings for

the BPEL workflow language.• Continuations vs. bisimilar state machines -which

is better for correctness proofs?• How relaxing your concurrency constraints results

in higher throughput.

Page 8: Beyond Unit Testing

8

Or:System Testing

Page 9: Beyond Unit Testing

9

System Tests

• Deploy the app • Add a real dataset• Use the app server• Remotely test from

other sites/hosts• Test in the client• Are big, complex

and distributed

Page 10: Beyond Unit Testing

10

How to test big systems

• Simulate the production system.• Automate deployment• Write functional tests• Remote test from clients

Page 11: Beyond Unit Testing

11

Embrace Virtualization

• VMWare player free; workstation for $£€

• Create VM images that resemble production configurations.

• Deploy and test into virtual machines• Host continuous integration server in

VMs• Simulate complex/broken networks

Simulate the production system

Automate deploymentWrite functional tests

Remote test from clients

Page 12: Beyond Unit Testing

12

…and become a cluster admin

• PXE System Installers: linuxcoe.sf.net • Auto-rollback images during test and production• Isolate insecure platforms on virtual network

Page 13: Beyond Unit Testing

13

Automate app deployment

• RPM/APT/.msi packages pushed out to hosts• SmartFrog: http://smartfrog.org/• Cargo: http://cargo.codehaus.org• Shell Scripts• Ant build files using scp, ssh

Simulate the production system

Automate deploymentWrite functional tests

Remote test from clients

Page 14: Beyond Unit Testing

14

Database setup

• Data setup is too time consuming to do every test

• Use the same DB that production will have.• Automated set up of the database• keep this DB snapshot and revert to it after

a run. (or the entire virtual machine image)

<mysql-admin> CREATE DATABASE diary; GRANT ALL PRIVILEGES ON diary.* TO 'diary'@'localhost'; SET PASSWORD FOR 'diary'@'localhost' = PASSWORD('${mysql.diary.pass}');</mysql-admin>

Page 15: Beyond Unit Testing

15

What to test?

• system health tests• In-container unit tests• Remote web service/HTML tests• In-browser GUI testing• Load tests• Network failure simulations

Simulate the production system

Automate deploymentWrite functional tests

Remote test from clients

Page 16: Beyond Unit Testing

16

Health Test: “happy pages”

<waitfor maxwait="30" maxwaitunit="second" timeoutproperty="unhappy"> <http url="http://server/happyaxis.jsp"/></waitfor><fail if="unhappy"/>

<%@ taglib uri="/WEB-INF/diary.tld" prefix="h" %><body><ha:happy classMustExist="org.jdom.JDOMException" errorText="JDom missing"/>We are happy</body></html>

Delegate to machines:

Page 17: Beyond Unit Testing

17

Test in-containerwith cactus

http://jakarta.apache.org/cactus/

<cactus>/IDE Application/Web Server

CactusTest extends

ServletTestCaseCactus Servlet

CactusTest extends

ServletTestCase

Server-sideclasses

setUptestXXXtearDown

HTTP

NormalTest extends TestCase

Simulate the production system

Automate deploymentWrite functional tests

Remote test from clients

Page 18: Beyond Unit Testing

18

Cactus Test Case

http://jakarta.apache.org/cactus/

public class CactusPersistTest extends ServletTestCase { private static int counter = 0; private SessionFactory factory;

public void testPersist() throws Exception { Event event = createTestEvent(); Session session = factory.openSession(); try { session.persist(event); } finally { session.close(); } assertEventIsInDB(event); } }

Simulate the production system

Automate deploymentWrite functional tests

Remote test from clients

Page 19: Beyond Unit Testing

19

<cactus> task choreographs

http://jakarta.apache.org/cactus/

<cactus:cactus warfile="${cactus.war}" errorProperty="cactus.failed" failureProperty="cactus.failed"> <containerset> <generic name="server" port="8080"> <startup> <copy file="${cactus.war}" tofile="${cactus.destfile}" overwrite="true"/> </startup> <shutdown> <delete file="${cactus.destfile}"/> </shutdown> </generic> </containerset> <classpath><path refid="test.classpath"/></classpath> <formatter type="xml"/> <batchtest todir="${test.data.dir}"> <fileset dir="test" includes="**/*Test.java"> </batchtest></cactus:cactus>

Simulate the production system

Automate deploymentWrite functional tests

Remote test from clients

Page 20: Beyond Unit Testing

20

Cactus Demo

−Needs classpath right for client and server

−cactus servlet is possible security risk

http://jakarta.apache.org/cactus/

Page 21: Beyond Unit Testing

21

GUI testing hurts

• Static HTML is the easiest (HttpUnit)• Swing, DHTML, SWT, Flash hard.• Most people stop at the “model”• Whoever does a new GUI -fix this!

Simulate the production system

Automate deploymentWrite functional tests

Remote test from clients

Page 22: Beyond Unit Testing

22

jsUnit is JUnit for JavaScript

http://www.jsunit.net/

function test3() { var buffer = top.testManager.documentLoader.buffer(); var emps = buffer.document.getElementsByTagName('employee'); assert('expected 5 employees, not ' + emps.length, emps.length == 5); var empid = emps[0].getElementsByTagName('employeeId'); assert('employeeId[0] was ' + empid[0].firstChild.data, empid[0].firstChild.data == 'EMP0001');}

Page 23: Beyond Unit Testing

23

Selenium: tests in a table

http://www.openqa.org/selenium/

Selenium Server

Browser

SeleniumTests

JUnit

<tr> <td>verifyTitle</td> <td>Click Page Target</td> <td>&nbsp;</td></tr>

Page 24: Beyond Unit Testing

24

WS Interop Testing

• Use the real client API/classes• Pass down URLs via system properties

• Test different endpoints in parallel processes• Include timeouts; proxy support• Log for blame assignment

protected String getOption(String property, boolean required) { String option = System.getProperty(property); if (required && option== null) { fail("No property " + property); } return option;}

ex: http://deployapi.iseran.com:8080/logs/

Simulate the production system

Automate deploymentWrite functional tests

Remote test from clients

Page 25: Beyond Unit Testing

25

Distributed Testing

• Allocate & configure test systems• Deploy application across nodes• Deploy tests on other nodes• Collect and correlate results• Try to understand what went wrong

Simulate the production system

Automate deploymentWrite functional tests

Remote test from clients

Page 26: Beyond Unit Testing

26

SmartFrogA framework for describing, deploying and managing distributed service components.

HttpUnitTests extends JUnitTestSuite { package "d1.webapp.test"; name "HttpUnitTests"; server.url TBD; sfProcessHost "client"; properties [ ["server.url",server.url], ["cactus.contextURL",server.url] ]; classes [ "EventFeedTest", "HappyTagTest", "IndexTest" ];}

http://smartfrog.org/

Client

JUnit

HttpUnit

Test Master

Test ListenerTest Runner

- SmartFrog daemon

Page 27: Beyond Unit Testing

27

Distributed Deployment of App & JUnitDatabase VM

Test Database

MySQL

App Server VM

App Server

Web App

Client

HttpUnit

Selenium

JUnit

Test Master

Test Listener

Test Runner

- SmartFrog daemon

Page 28: Beyond Unit Testing

28

XHTML output of test results

−no x-system summary

−no merging of logs from different systems

−no notification

+~live output+log capture

Page 29: Beyond Unit Testing

29

Future GUI? GridUnit

http://gridunit.sourceforge.net/

• Swing GUI for testing on OurGrid

• Unit test across many different machines

• But not (yet) distributed applications

• Aggregate view of results

• “partial” success• Common JUnit wire

format

Page 30: Beyond Unit Testing

30

Call to Action

• Focus on system tests• Embrace Virtualization: VMWare, Xen• Use Cactus for in-container testing• Use Selenium/jsUnit for browser tests • Join us in distributed system testing

Page 31: Beyond Unit Testing

31

Junit4?

• Java5 only• Extension tools not there yet• Integration with Ant, Maven coming

along.• Ant 1.7 <junit> will work with

junit4.jar• JUnit team plan their own task

(Ant team are working with them)