Automatisches Testen und Bewerten von Java-Klassen

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
der Universität Oldenburg
der Universität Oldenburg
der Universität Oldenburg
der Universität Oldenburg
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Einführung in die Programmierung Ausführbare Klassen
Einführung in die Programmierung Zusammenfassung
Imperative Programmierung -Entwicklungswerkzeuge
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java -
Spec# Proseminar Assertions im SS 2007 Uni Paderborn Andreas Martens Betreuer: Dipl. Inform. Björn Metzler.
Universität Stuttgart Institut für Kernenergetik und Energiesysteme Einzeltests im Rahmen des V-Modelles Aufgaben Überprüfung des Programmcodes mit Hilfe.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
SWITCH - Anweisung.
IF-ELSE-IF-Ketten Weiter mit PP..
WHILE - Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 4 Vererbung Sommersemester 2003 Lars Bernard.
Imperative Programmierung Funktionen und Parameter
Java-Kurs - 2. Übung Entwicklungsumgebung Struktur von Programmen
Praxis-Repetitorium JAVA zusätzliche, ergänzende Lehrveranstaltung
3. Klassendiagramme in Java implementieren
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
1DVG3 - anonyme Klassen Anonyme Klassen. DVG3 - anonyme Klassen 2 Syntax new BasisKlasse(Parameterliste) { Modifikationen und Erweiterungen der Basisklasse.
DVG Einführung in Java1 Einführung in JAVA.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Thema: Fibonacci-Zahlen
Bestimmung des ggT zweier Zahlen
Verzweigung.
Vererbung Einfache Vererbung – Erben von abstrakten Klassen – Implementieren eines Interfaces.
© 2003 Pohlig Informatikgrundkurs (Pohlig-Häberle) 1 5.Was ist eine Syntax? – Ein bierseliger Bayer im Himmel 5.1 Syntax des frohlockenden Bayern Alois.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Rekursive Funktionen (Fakultät)
University of Applied Sciences Übung Objektorientierte Programmierung II Dipl.-Inf. (FH) Markus Vogler.
Einführung in die Programmiersprache Java
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Informatik Objekte und Klassen 1. Objektorientiertes Modellieren und Programmieren 1.1 Objekte und Klassen.
Objektorientiertes Konstruieren
Einführung in JavaKara
ac.at1 EPROG Tutorium #1 Philipp Effenberger Einführung in Java Schlüsselworte Datentypen.
Starten der Entwicklungsumgebung (IDE)
Programmierung von Agenten in Java: Implementierung einer Supply-Chain
Javelin Internet-based parallel computing using Java.
Programmiervorkurs WS 2014/15 Methoden
Programmiervorkurs WS 2014/15 Schleifen
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Übung Informatik I exercise01. 2 Inhaltsübersicht Nachbesprechung Übung 1 Individuelle Fragen/Bemerkungen.
Web und Mobile Apps Programmieren Marco Jakob Kurzvortrag OSS an Schulen
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
© 2004 Pohlig Informatik Kurse © 2004 Pohlig Informatik Kurse Der Tramp tanzt die Rekursion zünderUntersuchen(…) Basisfall Rückmeldung:
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/ Übungsaufgabe vom Logische Ausdrücke 1.true & false | true 2.(10>2)
Einführung in Java PING e.V. Weiterbildung Andreas Rossbacher 24. März 2005.
Java Programme nur ein bisschen objektorientiert.
JAVA lernen: Methoden.
Java-Kurs - 4. Übung weitere Kontrollstrukturen
Java-Kurs - 2. Übung primitive Datentypen, Konstanten
Mit der Turtle Java Programmieren
Cäsar-Verschlüsselung
Grundkurs Informatik mit Java
Schleifen mit der Turtle
Mit Java die Turtle steuern
Cäsar-Verschlüsselung
 Präsentation transkript:

Automatisches Testen und Bewerten von Java-Klassen Im Rahmen des Seminars „E-Learning“ Christof Wingender c.wingender@uni-muenster.de 15./16. Mai 2008

Motivation Papierbasierte Lernfortschrittskontrolle Klausur, Übungen Medienbrüche Personal- und Zeitaufwändig Menschliche Fehler, Subjektivität Lösung: E-Assessment von Java-Klassen?

Gliederung Einführung Ansätze zum E-Assessment von Java-Klassen Anforderungen an Java-Klassen Analyse von Java-Klassen Ansätze zum E-Assessment von Java-Klassen Praktomat Environment for Learning to Program extreme eLearning experience Erweiterung der Ansätze Fazit

Anforderungen an Java-Klassen Korrektheit Robustheit Leichte Wartbarkeit Verständlichkeit Testbarkeit Effiziente Programme (vgl. [PI08])

Analyse von Java-Klassen Statische Analyse Keine Ausführung des Programms Syntax, Semantik Programmierstil Fehlermuster im Quelltext Dynamische Analyse Ausführung des Programms Unit-Test (Komponententest)

Gliederung Einführung Ansätze zum E-Assessment von Java-Klassen Anforderungen an Java-Klassen Analyse von Java-Klassen Ansätze zum E-Assessment von Java-Klassen Praktomat Environment for Learning to Program extreme eLearning experience Erweiterung der Ansätze Fazit

Praktomat Universität Passau Java, Haskell, C++ Automatische Tests Öffentliche vs. geheime Testfälle DejaGnu Checkstyle Sandbox Peer-Review

Environment for Learning to Program (ELP) Queensland Universität in Brisbane C#, C++, Java, Pascal, Visual Basic Beispielaufgabe: IntegerDivision: import TerminalIO.*; public class IntegerDivision { KeyboardReader reader = new KeyboardReader(); ScreenWriter writer = new ScreenWriter(); public void run() {        } public static void main (String[] args){…} //Declare variables // Print “Please enter integer x: “ // Read x // Print “Please enter integer y: “ // Read y // Print “x / y = “ // Print x / y

Environment for Learning to Program (ELP) Programmierstil-Überprüfung: Java-Reflection API Normalisierung Quelltext-Fragment /* Zu lösender Abschnitt: */ vor = 0; nach = 1; for (int i = 3; i<= grenze; i++){ hilf = vor + nach vor = nach; nach = hilf } /* Ende zu lösender Abschnitt */

Environment for Learning to Program (ELP) Programmierstil-Überprüfung: Java-Reflection API Normalisierung Quelltext-Fragment Normalisierte Form /* Zu lösender Abschnitt: */ vor = 0; nach = 1; for (int i = 3; i<= grenze; i++){ hilf = vor + nach vor = nach; nach = hilf } /* Ende zu lösender Abschnitt */ <gap> <statements> <assignment>2 </assignment> <loop> <assignment>3 </loop> </statements> </gap> <condition> <trueBranch> <falseBranch> <methodCall> Vergleich: Abgabe - Musterlösung

extreme eLearning experience (xLx) Universität Münster Java Automatische Tests Öffentliche vs. geheime Testfälle JUnit Apache Ant Policies

Gegenüberstellung der Ansätze Praktomat ELP xLx Programmierstil Fehlermuster Funktionalität Effizienz

Gliederung Einführung Ansätze zum E-Assessment von Java-Klassen Anforderungen an Java-Klassen Analyse von Java-Klassen Ansätze zum E-Assessment von Java-Klassen Praktomat Enviroment for Learning to Program extreme eLearning experience Erweiterung der Ansätze Fazit

Erweiterung Apache Ant  Buildfile Buildfile enthält Projekt und beschreibt, wie Anwendung zu erstellen, zu testen und zu deployen ist <?xml version=“1.0“ ?> <project name=“myProject“ default=“makedir“> <target name=“makedir“> <mkdir dir=“build/classes“ /> <mkdir dir=“test/reports“ /> </target> </project> Project Target Task

Build-Prozess Quelltext

Build-Prozess Quelltext Checkstyle Bericht Programmierstil

Build-Prozess Quelltext Checkstyle FindBugs Bericht Programmierstil Fehlermuster

Build-Prozess Quelltext Testklassen Quelltext javac javac Checkstyle FindBugs .class-Dateien Bericht Programmierstil Bericht Fehlermuster JUnit Bericht Funktionalität

Beispiel: Fahrrad.class public class Fahrrad { private Rahmen rahmen; private boolean einrad; private String marke; public boolean isEinrad() { if (einrad == true) { return true; } else { return false; } } public boolean isEqualRahmen(Rahmen rahmen) { return ( (this.rahmen != null) & this.rahmen.equals(rahmen) ); } public boolean isEqualMarke(String marke) { return (this.marke == marke); } //Getter, Setter, ... }

Checkstyle Statische Analyse Überprüft Programmierstil JavaDoc Namenskonventionen … Konfiguration über XML-Datei Beispiel: String-Vergleiche (==, != statt equals) <module name="StringLiteralEquality"/> public boolean isEqualMarke(String marke) { return (this.marke == marke);} Richtig: return ((this.marke.equals(marke)); Weiteres Modul: MagicNumber

FindBugs Statische Analyse Findet mögliche Fehler Beispiel: Nullpointer public boolean isEqualRahmen(Rahmen rahmen) { return((this.rahmen != null) & this.rahmen.equals(rahmen));} Besser: return ((this.rahmen != null) && this.rahmen.equals(rahmen);

Alternative: PMD Statische Analyse Wie FindBugs Zusätzlich: Suboptimaler Quelltext Unbenutzer Quelltext Beispiel: Vergleiche in booleschen Ausdrücken public boolean isEinrad() { if(einrad == true) { return true; } else { return false; }} Besser: return einrad;

JUnit Dynamische Analyse Komponententest Stichprobenverfahren Beispiel: isEqualRahmen public void testIsEqualRahmen() { Fahrrad rad = new Fahrrad(); rad.setEinrad (false); rad.setRahmen (new Rahmen("rot", 48)); assertEquals (true, rad.isEqualRahmen(new Rahmen ("rot", 48))); }

Bewertung Überprüfung Erweiterbar Problematisch Programmierstil Potentielle Fehler Funktionalität Effizienz Erweiterbar Problematisch GUIs, Applets

Gliederung Einführung Ansätze zum E-Assessment von Java-Klassen Anforderungen an Java-Klassen Analyse von Java-Klassen Ansätze zum E-Assessment von Java-Klassen Praktomat Enviroment for Learning to Program extreme eLearning experience Erweiterung der Ansätze Fazit

Fazit Automatische Überprüfung von Keine automatische Überprüfung von Programmierstil Potentiellen Fehlern Funktionalität Keine automatische Überprüfung von Effizienz Aufgaben mit GUI oder Applets Trainingsbereiche Statische Analyse Aufgabenpool

Literaturverzeichnis [AA08] Apache Ant: http://ant.apache.org, Abrufdatum 01.04.2008. [Ch08] Checkstyle: http://checkstyle.sourceforge.net, Abrufdatum 01.04.2008. [ELP08] Environment for Learning to Program: http://elp.fit.qut.edu.au, Abrufdatum 01.04.2008. [FB08] FindBugs: http://findbugs.sourceforge.net, Abrufdatum 01.04.2008. [Ju08] JUnit: http://www.junit.org, Abrufdatum 01.04.2008. [PI08] Praktische Informatik: Informatik I: Kapitel 1: Einführung, http://www.wi.uni-muenster.de/pi/lehre/ws0708/info1/index.php, Abrufdatum 02.04.2008. [PMD08] PMD: http://pmd.sourceforge.net, Abrufdatum 01.04.2008. [Pr08] Praktomat: http//www.fim.uni-passau.de/de/fim/fakultaet/lehrstuehle/softwaresysteme/ forschung/praktomat.html, Abrufdatum 01.04.2008. [Xl08] extreme eLearning experience: http://dbms.uni-muenster.de/xLx, Abrufdatum 02.04.2008.

Java-Reflection API Zur Laufzeit Informationen zur Struktur einer Klasse // Klasse „laden“ Class<?> fahrrad = Class.forName("Fahrrad"); // Attribute der Klasse Fahrrad Field fields[] = fahrrad.getDeclaredFields(); // Methoden der Klasse Fahrrad Method methods[] = fahrrad.getDeclaredMethods();

Sicherheitsmanager Zwischen Aufrufer und Betriebssystem Kontrolle über problematische (gefährliche) Methoden der Java-Bibliothek Rechtevergabe: Policy-Datei grant-Anweisungen grant { permission java.io.FilePermission “<Filename>“, “read“;}; Nachteile Keine Rollen Kein Refresh (Neustart der Applikation)

JUnit Isolierte Ausführung der Testmethoden Keine Seiteneffekte  Neue Instanz der Klasse Herstellen der Testumgebung: setUp() Bereinigen der Testumgebung: tearDown()