Andreas Hartmann, Stephan Müller adesso AG JSF Testing: Tools und Technics
Speaker Andreas Hartmann [hartmann@adesso.de] Principal Software Engineer Tätigkeitsschwerpunkte: - Konzeption und Implementierung von Softwarearchitekturen und Frameworks auf Basis der JEE Plattform - Serviceorientierte Architekturen und Portaltechnologien im Kontext der Versicherungs- und Banken-Branche Stephan Müller [smueller@adesso.de] Senior Software Engineer Tätigkeitsschwerpunkte: - Konzeption und Implementierung von Portalen und Webanwendungen - Serviceorientierte Architekturen und Webtechnologien
Agenda Classification JSFUnit Apache Shale Test Selenium/Webdriver JMeter & Eclipse Memory Analyzer Put it Together Testing Startup
Agenda Classification JSFUnit Apache Shale Test Selenium/Webdriver JMeter & Eclipse Memory Analyzer Put it Together Testing Startup
Classification Konstruktive QS Analytische QS Programmier Guidelines Whitebox Test Templates Reviews Dynamische Tests Checklisten Statische Tests Blackbox Test Richtlinien Statische Analyse
Agenda Classification JSFUnit Apache Shale Test Selenium/Webdriver JMeter & Eclipse Memory Analyzer Put it Together Testing Startup
JSFUnit Überblick Entwickelt von JBoss Inc. und der JBoss Community Testerstellung mit JUnit In-Container Testing Statische Analyse Features JSFUnit Console JSF2.0 / Servlet 3.0 Unterstützung RichFaces (AJAX) Unterstüzung URL: http://www.jboss.org/jsfunit/
JSFUnit In-Container Testing Testausführung mit Cactus und HtmlUnit Tests werden mit Anwendung im Container deployed Ausführung durch Aufruf von Testseite oder JSFUnit Console Testmöglichkeiten Wert- und Zustandsänderungen in der Managed Beans Navigationsregeln Komponenten im UIViewTree Validierung FacesMessages
JSFUnit "Acrylic Box" Tests Kombiniert Whitebox und Blackbox Tests Führt JUnit Tests im WebContainer aus Erzeugt realen HTTP Request auf JSF Seite Prüft Änderungen im Server über JSF API Funktionen Keine Mock-Objekte
JSFUnit "Acrylic Box" Tests Beispiel index.jsp <f:view> <h:form id="form1"> <h:outputtext id="question" value="bitte Namen eingeben:" /> <h:inputtext id="input" value="#{mbean.text}" /> <h:commandbutton id="submit" value="absenden" action="/hello.jsp" /> </h:form> </f:view> hello.jsp <f:view> <h:outputtext id="output" value="hallo, #{mbean.text}" /> </f:view>
JSFUnit "Acrylic Box" Tests Beispiel public void testhalloandreas() throws IOException { JSFSession jsfsession = new JSFSession( "/index.jsf" ); JSFClientSession client = jsfsession.getjsfclientsession(); JSFServerSession server = jsfsession.getjsfserversession(); assertequals( "/index.jsp", server.getcurrentviewid() ); client.setvalue( "input", "Andreas" ); client.click( "submit" ); } assertequals( "/hello.jsp", server.getcurrentviewid() ); assertequals( "Andreas", server.getmanagedbeanvalue( "#{mbean.text}" ));
JSFUnit Statische Analyse (faces-config.xml) Prüft die Managed Bean Definition Sind alle Managed Beans im Scope Session oder Application serialisierbar? Besitzt die Managed Bean für jede managed-property eine Setter- Methode? Existieren doppelte Managed Bean Namen? Ist der angegebene Scope gültig? Existiert die angegebene Klasse? Leitet die angegebene Klasse von der richtigen Klasse ab? Testklasse erbt von AbstractFacesConfigTestCase
JSFUnit Statische Analyse (faces-config.xml) Beispiel import org.jboss.jsfunit.analysis.abstractfacesconfigtestcase; public class StaticAnalysisFacesConfigTest extends AbstractFacesConfigTestCase { private static Set<String> paths = new HashSet() {{ }}; add( "WebContent/WEB-INF/faces-config.xml" ); } public StaticAnalysisFacesConfigTest() { } super( paths );
JSFUnit Statische Analyse (Views) Prüft Value & Method Expressions Wird eine nicht-existente Managed Beans referenziert? Wird eine nicht-existente Action referenziert? Wird ein nicht-existenter ActionListener referenziert? Testklasse erbt von AbstractViewTestCase
JSFUnit Statische Analyse (Views) Beispiel import org.jboss.jsfunit.analysis.abstractviewtestcase; public class StaticAnalysisViewTest extends AbstractViewTestCase { private static Set<String> absoluteviewpaths = new HashSet() {{ add( "WebContent/index.jsp" ); }}; private static Set<String> recursiveviewpaths = new HashSet() {{ }}; add( "WebContent/views" ); public StaticAnalysisViewTest() { super( absoluteviewpaths, recursiveviewpaths, "WebContent/WEB-INF/faces-config.xml" ); } }
Agenda Classification JSFUnit Apache Shale Test Selenium/Webdriver JMeter & Eclipse Memory Analyzer Put it Together Testing Startup
Apache Shale Test Überblick Sub-Projekt des Apache Shale Projekts Entwickelt von der Apache Community Seit Mai 2009 auf Apache Attic ("Projekt-Friedhof") Stellt Mock-Objekte für den Servlet Container und JSF bereit Testerstellung mit JUnit URL: http://shale.apache.org/shale-test/
Apache Shale Test Whitebox Test Zentrale JSF Framework Klassen werden durch Mock-Objekte simuliert Application ExternalContext FacesContext Lifecycle Verhalten einer UI Komponente kann über Unit-Tests verifiziert werden Konvertierung Validierung Datenübernahme in Modell Testklasse erbt von AbstractJsfTestCase
Apache Shale Test Whitebox Test Beispiel @Override public void setup() throws Exception { super.setup(); // JSF initialisieren UIViewRoot viewroot = new UIViewRoot(); viewroot.setviewid( VIEW_ID ); facescontext.setviewroot( viewroot ); List<UIComponent> children = viewroot.getchildren(); UIInput inputfield = new UIInput(); inputfield.setid( INPUT_FIEDL_ID ); inputfield.setvalue( INPUT_FIEDL_VALUE ); children.add( inputfield );...
Apache Shale Test Whitebox Test Beispiel public void testaddglobalnotification() { } assertfalse( facescontext.getmessages().hasnext() ); Notification notification = NotificationFactory.newGlobalNotification( Mvc4JsfDisplayMessage.SYSTEM_FEHLER, Notification.Severity.SEVERITY_ERROR ); myviewcontroller.addnotification( notification ); asserttrue( facescontext.getmessages().hasnext() );
Apache Shale Test Whitebox Test Beispiel public void testgetuicomponent() { } UIInput inputfield = (UIInput)myViewController.getComponent( INPUT_FIEDL_ID ); assertequals( inputfield.getvalue(), INPUT_FIEDL_VALUE );
Agenda Classification JSFUnit Apache Shale Test Selenium/Webdriver JMeter & Eclipse Memory Analyzer Put it Together Testing Startup
Selenium/Webdriver Überblick Testframeworks für Web-Anwendungen Erleichtern die Erstellung automatisierter Tests Unterstützen gängige Browser Hilfreich für Kompatibilitätstest Tests werden in einem Fenster des gewünschten Browser ausgeführt Testerstellung mit JUnit URL: http://seleniumhq.org/
Selenium/Webdriver Selenium Führt Tests als JavaScript Anwendung im Browser aus Viele unterstützte Browser Firefox, IExplorer, Safari, Opera, Google Chrome, etc. Browserunabhängige Tests Ausführung in unterschiedlichen Browsern ohne Anpassung
Selenium/Webdriver Selenium-IDE Firefox-Plugin Capture-and-Replay Funktionalität Interaktives Testen im Browser Aufzeichnen und Ausführen von Tests Exportieren von Tests als HTML, Java, C#, PHP, Perl, Python und Ruby Code
Selenium/Webdriver Selenium-RC / Selenium-Grid Testautomatisierung mit Selenium-RC Testentwicklung in Java, C#, PHP, Perl, Python und Ruby Unterstützte Browser: Firefox, IExplorer, Safari, Opera, Google Chrome, etc. Parallele Tests mit Selenium-Grid Steuert mehrere Instanzen von Selenium-RC Zeitersparnis durch Parallelisierung Einsatz für Lasttests Amazon EC2 Unterstützung
Selenium/Webdriver Selenium Beispiel @Test public void fillinputfieldandsubmit() { selenium.open( "/de/" ); assertequals( "adesso AG - Herzlich willkommen!", selenium.gettitle() ); // Eingabefeld auslesen, Suchbegriff eingeben & Anfrage absenden assertequals( "Suchen", selenium.getvalue( "textfield" ) ); selenium.type( "textfield", "Jobs" ); selenium.click( "suchicon" ); selenium.waitforpagetoload( "30000" ); assertequals( "adesso AG - Ergebnisse Ihrer Suchanfrage, selenium.gettitle() ); }
Selenium/Webdriver Webdriver Verfolgt gleichen Ansatz wie Selenium Aber: Steuert Browser über einen Treiber fern Native Treiber für IExplorer, Firefox, Chrome Integration in Selenium 2.0 Stärken Behandlung von multiplen Frames, Browserfenstern, Popups und Alerts Seiten-Nagivation AJAX UI Elemente
Selenium/Webdriver Webdriver Beispiel @Test public void fillinputfieldandsubmit() { driver.get( "http://www.adesso.de" ); assertequals( "adesso AG - Herzlich willkommen!", driver.gettitle() ); // Eingabefeld finden, leeren, Suchbegriff eingeben & Anfrage absenden WebElement search = driver.findelement( By.id( "textfield" ) ); assertequals( "Suchen", search.getvalue() ); search.clear(); search.sendkeys( "Jobs" ); search.submit(); // Titel der Seite prüfen assertequals( "adesso AG - Ergebnisse ihrer Suchanfrage", driver.gettitle() ); }
Agenda Classification JSFUnit Apache Shale Test Selenium/Webdriver JMeter & Eclipse Memory Analyzer Put it Together Testing Startup
JMeter & MAT JMeter Werkzeug zur Durchführung von Lasttests Http FTP JDBC SOAP/XML-RCP JUnit Erstellung von Testplänen Performancemessung URL: http://jakarta.apache.org/jmeter/
JMeter & MAT JMeter
JMeter & MAT JMeter goes JSF Regular Expression Extractor HTTP Request*
JMeter & MAT Heap Dump jmap -dump:file=d:/wastememory.hprof 4300
JMeter & MAT Eclipse Memory Analyzer
Agenda Classification JSFUnit Apache Shale Test Selenium/Webdriver JMeter & Eclipse Memory Analyzer Put it Together Testing Startup
Put it Together QS Tools JUnit Easy Mock JSFUnit Apache WebDriver JMeter & Shale Selenium MAT Presentation-Layer Business-Layer Integration-Layer
Agenda Classification JSFUnit Apache Shale Test Selenium/Webdriver JMeter & Eclipse Memory Analyzer Put it Together Testing Startup
Testing Startup Auswahl der für das Projekte angemessenen Testwerkzeuge Testanforderungen bei der Architektur mit berücksichtigen Festlegung was wie getestet werden soll Integration der Tests in den Buildprozess Regressionsfähigkeit der Tests Testdaten
Testing Startup Testing and more QM Plan Organisation, Mittel, Planung, Reporting und Werkzeuge der Qualitätssicherung Abnahme von Quality-Gates Abnahmeprotokoll für Meilensteine, an denen eine Qualitätskontrolle im Projekt erfolgt Wichtiger Erfolgsfaktor: Unterstützung des Managements sicherstellen QS-Projektsteckbrief Inhalte und Termine eines Projekts mit Fokus auf Qualitätssicherung Review Fachliche Qualitätssicherung Architektur-Review Code-Review
Vielen Dank für Ihre Aufmerksamkeit. info@adesso.de / www.adesso.de