CSCE 747 Software Testing and Quality Assurance

Slides:



Advertisements
Similar presentations
J-Unit Framework.
Advertisements

Apache Struts Technology
Test-Driven Development and Refactoring CPSC 315 – Programming Studio.
T ESTING WITH J UNIT IN E CLIPSE Farzana Rahman. I NTRODUCTION The class that you will want to test is created first so that Eclipse will be able to find.
JUnit Automated Software Testing Framework Paul Ammann & Jeff Offutt Thanks in part to Aynur Abdurazik.
Objectives: Test Options JUnit Testing Framework TestRunners Test Cases and Test Suites Test Fixtures JUnit.
JUnit Automated Software Testing Framework Paul Ammann & Jeff Offutt Thanks in part to Aynur Abdurazik.
Approach of Unit testing with the help of JUnit Satish Mishra
JUnit Syed Nabeel. Motivation Unit Testing Responsibility of  developer Rarely done properly Developers Excuse: “I am too much in a hurry”
JUnit, Revisited 17-Apr-17.
TDD Test-Driven Development. JUnit 4.0 To use annotations need to import org.junit.Test To use assertion need to import org.junit.Assert.* No need to.
Programmer Testing Testing all things Java using JUnit and extensions.
Struts 2.0 an Overview ( )
UNIT-V The MVC architecture and Struts Framework.
CVSQL 2 The Design. System Overview System Components CVSQL Server –Three network interfaces –Modular data source provider framework –Decoupled SQL parsing.
Chapter 7 Designing Classes. Class Design When we are developing a piece of software, we want to design the software We don’t want to just sit down and.
© Dr. A. Williams, Fall Present Software Quality Assurance – JUnit Lab 1 JUnit A unit test framework for Java –Authors: Erich Gamma, Kent Beck Objective:
JUnit The framework. Goal of the presentation showing the design and construction of JUnit, a piece of software with proven value.
REFACTORING Lecture 4. Definition Refactoring is a process of changing the internal structure of the program, not affecting its external behavior and.
Principles of Object Oriented Programming Practical session 2 – part A.
Testing in Extreme Programming
Unit testing Unit testing TDD with JUnit. Unit Testing Unit testing with JUnit 2 Testing concepts Unit testing Testing tools JUnit Practical use of tools.
Software Engineering 1 Object-oriented Analysis and Design Chap 21 Test-Driven Development and Refactoring.
Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.
A tool for test-driven development
Tools - Hamcrest 1 CSCE 747 Fall 2013 CSCE 747 Software Testing and Quality Assurance Tools 12 – Hamcrest 10/02/
By Rick Mercer with help from Kent Beck and Scott Ambler Java Review via Test Driven Development (TDD)
EMBEDDED REAL-TIME, INC. December 8, 2015 Java Unit Mark Mosher Rochester Java Users Group.
JUnit Don Braffitt Updated: 10-Jun-2011.
JUnit A framework which provides hooks for easy testing of your Java code, as it's built Note: The examples from these slides can be found in ~kschmidt/public_html/CS265/Labs/Java/Junit.
Scalatest. 2 Test-Driven Development (TDD) TDD is a technique in which you write the tests before you write the code you want to test This seems backward,
JUnit. Introduction JUnit is an open source Java testing framework used to write and run repeatable tests JUnit is integrated with several IDEs, including.
Software Design 1.1 CPS 108, Spring 2006 l Object oriented programming and design, we'll use Java and C++  Language independent concepts including design.
S Ramakrishnan1 Systems V & V, Quality and Standards Dr Sita Ramakrishnan School CSSE Monash University.
1 Unit Testing with JUnit CS 3331 JUnit website at Kent Beck and Eric Gamma. Test Infected: Programmers Love Writing Tests, Java Report,
(1) Test Driven Development Philip Johnson Collaborative Software Development Laboratory Information and Computer Sciences University of Hawaii Honolulu.
Test a Little, Code a Little Colin Sharples IBM Global Services New Zealand Colin Sharples IBM Global Services New Zealand.
Chapter 11: Advanced Inheritance Concepts. Objectives Create and use abstract classes Use dynamic method binding Create arrays of subclass objects Use.
Unit Testing with FlexUnit
Lec 15 Testing GUIs 1 CSCE 747 Fall 2013 CSCE 747 Software Testing and Quality Assurance Lecture 15 GUI Testing 10/21/
Today protected access modifier Using the debugger in Eclipse JUnit testing TDD Winter 2016CMPE212 - Prof. McLeod1.
Software Engineering 1 Object-oriented Analysis and Design Applying UML and Patterns An Introduction to Object-oriented Analysis and Design and Iterative.
SWE 434 SOFTWARE TESTING AND VALIDATION LAB2 – INTRODUCTION TO JUNIT 1 SWE 434 Lab.
Modern Programming Tools And Techniques-I
Software Construction Lab 10 Unit Testing with JUnit
Don Braffitt Updated: 26-Mar-2013
Unit Testing - solid fundamentals
Testing Alfresco extensions (no, it’s not about jUnit)
JUnit Automated Software Testing Framework
Object-Oriented Analysis and Design
Introduction to JUnit CS 4501 / 6501 Software Testing
Unit testing Java programs Using JUnit
Activities and Intents
Data Modeling II XML Schema & JAXB Marc Dumontier May 4, 2004
Software Engineering 1, CS 355 Unit Testing with JUnit
CSCE 741 Software Process Lecture 04 Availability
CSCE 741 Software Process Lecture 04 Availability
Advanced Programming Behnam Hatami Fall 2017.
Test-first development
JUnit Automated Software Testing Framework
CISC124 Assignment 3 due this Wednesday at 7pm.
CMPE212 – Stuff… Assn 2 due this Friday. Winter 2018
Test-driven development (TDD)
Credit to Eclipse Documentation
Introduction to JUnit CS 4501 / 6501 Software Testing
Fall 2018 CISC124 2/1/2019 CISC124 Note that the next assignment, on encapsulation, is due next Wednesday at 7pm – not Friday. The next Quiz is not until.
CMPE212 – Reminders Assignment 2 due this Friday.
CMPE212 – Reminders Assignment 2 due this Friday.
JUnit Dwight Deugo Nesa Matic Portions of the notes for this lecture include excerpts from the Eclipse 3.0 and.
Principles of Object Oriented Programming
Presentation transcript:

CSCE 747 Software Testing and Quality Assurance Tools 12 – Hamcrest 10/02/2013

What is Hamcrest? http://hamcrest.org/ http://code.google.com/p/hamcrest/wiki/Tutorial http://junit.sourceforge.net/doc/cookbook/cookbook.htm http://hamcrest.org/JavaHamcrest/javadoc/1.3/ http://en.wikipedia.org/wiki/Mockito

http://code.google.com/p/hamcrest/wiki/Tutorial

Hamcrest is a framework for writing matcher objects allowing 'match' rules to be defined declaratively. There are a number of situations where matchers are invaluble, such as UI validation, or data filtering, but it is in the area of writing flexible tests that matchers are most commonly used. http://code.google.com/p/hamcrest/wiki/Tutorial

My first Hamcrest test import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import junit.framework.TestCase; public class BiscuitTest extends TestCase { public void testEquals() { Biscuit theBiscuit = new Biscuit("Ginger"); Biscuit myBiscuit = new Biscuit("Ginger"); assertThat(theBiscuit, equalTo(myBiscuit)); } } // Note JUnit3 http://code.google.com/p/hamcrest/wiki/Tutorial

assertThat("hazelnuts", theBiscuit.getHazelnutCount(), equalTo(3)); If you have more than one assertion in your test you can include an identifier for the tested value in the assertion: assertThat("chocolate chips", theBiscuit.getChocolateChipCount(), equalTo(10)); assertThat("hazelnuts", theBiscuit.getHazelnutCount(), equalTo(3)); http://code.google.com/p/hamcrest/wiki/Tutorial

Hamcrest Common Matchers A tour of Hamcrest comes with a library of useful matchers. Here are some of the most important ones. Core anything - always matches, useful if you don't care what the object under test is describedAs - decorator to adding custom failure description is - decorator to improve readability - see "Sugar", below Logical allOf - matches if all matchers match, short circuits (like Java &&) anyOf - matches if any matchers match, short circuits (like Java ||) not - matches if the wrapped matcher doesn't match and vice versa http://code.google.com/p/hamcrest/wiki/Tutorial

Object Beans equalTo - test object equality using Object.equals hasToString - test Object.toString instanceOf, isCompatibleType - test type notNullValue, nullValue - test for null sameInstance - test object identity Beans hasProperty - test JavaBeans properties http://code.google.com/p/hamcrest/wiki/Tutorial

Collections array - test an array's elements against an array of matchers hasEntry, hasKey, hasValue - test a map contains an entry, key or value hasItem, hasItems - test a collection contains elements hasItemInArray - test an array contains an element Number closeTo - test floating point values are close to a given value greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo - test ordering http://code.google.com/p/hamcrest/wiki/Tutorial

Text equalToIgnoringCase - test string equality ignoring case equalToIgnoringWhiteSpace - test string equality ignoring differences in runs of whitespace containsString, endsWith, startsWith - test string matching http://code.google.com/p/hamcrest/wiki/Tutorial

Syntactic Sugar Hamcrest strives to make your tests as readable as possible. For example, the “is” matcher is a wrapper that doesn't add any extra behavior to the underlying matcher., but increases readability. The following assertions are all equivalent: assertThat(theBiscuit, equalTo(myBiscuit)); assertThat(theBiscuit, is(equalTo(myBiscuit))); assertThat(theBiscuit, is(myBiscuit)); The last form is allowed since is(T value) is overloaded to return is(equalTo(value)). http://code.google.com/p/hamcrest/wiki/Tutorial

Writing custom matchers matcher for testing if a double value has the value NaN (not a number). This is the test we want to write: public void testSquareRootOfMinusOneIsNotANumber() {   assertThat(Math.sqrt(-1), is(notANumber())); } http://code.google.com/p/hamcrest/wiki/Tutorial

isNotANumber Implementation package org.hamcrest.examples.tutorial; import org.hamcrest.Description; import org.hamcrest.Factory; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; http://code.google.com/p/hamcrest/wiki/Tutorial

public class IsNotANumber extends TypeSafeMatcher<Double> { public class IsNotANumber extends TypeSafeMatcher<Double> {   @Override   public boolean matchesSafely(Double number) {     return number.isNaN();   }   public void describeTo(Description description) {     description.appendText("not a number");   }   @Factory   public static <T> Matcher<Double> notANumber() {     return new IsNotANumber();   } } http://code.google.com/p/hamcrest/wiki/Tutorial

assertThat(1.0, is(notANumber())); fails with the message java.lang.AssertionError: Expected: is not a number     got : <1.0> http://code.google.com/p/hamcrest/wiki/Tutorial

Sugar generation create an XML configuration file listing all the Matcher classes <matchers> <!-- Hamcrest library --> <factory class="org.hamcrest.core.Is"/>  <!-- Custom extension -->  <factory class= "org.hamcrest.examples.tutorial.IsNotANumber"/> </matchers> http://code.google.com/p/hamcrest/wiki/Tutorial

Run the org. hamcrest. generator. config Run the org.hamcrest.generator.config.XmlConfigurator command-line tool that comes with Hamcrest http://code.google.com/p/hamcrest/wiki/Tutorial

// Generated source package org.hamcrest.examples.tutorial; public class Matchers {   public static <T> org.hamcrest.Matcher<T> is(T param1) {     return org.hamcrest.core.Is.is(param1);   }   public static <T> org.hamcrest.Matcher<T> is(java.lang.Class<T> param1) {     return org.hamcrest.core.Is.is(param1);   }   public static <T> org.hamcrest.Matcher<T> is(org.hamcrest.Matcher<T> param1) {     return org.hamcrest.core.Is.is(param1);   }   public static <T> org.hamcrest.Matcher<java.lang.Double> notANumber() {     return org.hamcrest.examples.tutorial.IsNotANumber.notANumber();   } } http://code.google.com/p/hamcrest/wiki/Tutorial

update our test to use the new Matchers class import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.examples.tutorial.Matchers.*; import junit.framework.TestCase; public class CustomSugarNumberTest extends TestCase {   public void testSquareRootOfMinusOneIsNotANumber() {     assertThat(Math.sqrt(-1), is(notANumber()));   } } http://code.google.com/p/hamcrest/wiki/Tutorial

import static org. junit. Assert. ; import static org. hamcrest import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; public class Junit4FeaturesTest { @org.junit.Test public void testArrays() { assertThat(new Integer[] {1,2,3,4,5}, equalTo(new Integer[]{1,2,3,4,5})); assertThat(new Integer[] {1,2,3,4,5}, not(new Integer[] {1,2})); } http://www.acgavin.com/hamcrest-and-junit4-4

import static org. junit. Assert. ; import static org. hamcrest import static org.junit.Assert.*; import static org.hamcrest.Matchers.*; // provided by additional jar import org.junit.Test; public class Junit4FeaturesTest { @Test public void testNumericComparison() { assertThat(1,lessThan(2)); assertThat(2,greaterThan(1)); assertThat(2,greaterThanOrEqualTo(2)); assertThat(1,lessThanOrEqualTo(1)); http://www.acgavin.com/hamcrest-and-junit4-4

Hamcrest API http://junit.org/javadoc/4.10/org/hamcrest/Matcher.html

http://hamcrest.org/JavaHamcrest/javadoc/1.3/ org.hamcrest Interface Matcher<T> All Superinterfaces: SelfDescribing All Known Implementing Classes: AllOf, AnyOf, BaseMatcher, BigDecimalCloseTo, CombinableMatcher, CustomMatcher, CustomTypeSafeMatcher, DescribedAs, DiagnosingMatcher, Every, FeatureMatcher, HasProperty, HasPropertyWithValue, HasToString, HasXPath, Is, IsAnything, IsArray, IsArrayContaining, IsArrayContainingInAnyOrder, IsArrayContainingInOrder, IsArrayWithSize, IsCloseTo, IsCollectionContaining, IsCollectionWithSize, IsCompatibleType, IsEmptyCollection, IsEmptyIterable, IsEmptyString, IsEqual, IsEqualIgnoringCase, IsEqualIgnoringWhiteSpace, IsEventFrom, IsIn, IsInstanceOf, IsIterableContainingInAnyOrder, IsIterableContainingInOrder, IsIterableWithSize, IsMapContaining, IsNot, IsNull, IsSame, OrderingComparison, SamePropertyValuesAs, SamePropertyValuesAs.PropertyMatcher, StringContains, StringContainsInOrder, StringEndsWith, StringStartsWith, SubstringMatcher, TypeSafeDiagnosingMatcher, TypeSafeMatcher

Freeman, Steve; Pryce, Nat (2009-10-12) Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

The Dilemma One of the dilemmas posed by the move to shorter and shorter release cycles is how to release more software in less time— and continue releasing indefinitely. Kent Beck Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

What if? What if instead, we treated software more like a valuable, productive plant, to be nurtured, pruned, harvested, fertilized, and watered? Traditional farmers know how to keep plants productive for decades or even centuries. How would software development be different if we treated our programs the same way? Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

“A complex system that works is invariably found to have evolved from a simple system that works.” John Gall 2003 Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Growing Objects Alan Kay’s concept of objects being similar to biological cells that send each other messages. Alan Kay was one of the authors of Smalltalk and coined the term “object-oriented.” Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Test Driven Development (TDD) Test-Driven Development (TDD) is a deceptively simple : Write the tests for your code before writing the code itself. it transforms the role testing plays in the development process Testing is no longer just about keeping defects from the users; instead, it’s about helping the team to understand the features that the users need and to deliver those features reliably and predictably. TDD radically changes the way we develop software dramatically improves the quality of the systems Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

What Is the Point of Test-Driven Development? One must learn by doing the thing; for though you think you know it, you have no certainty, until you try. —Sophocles Software Development as a Learning Process developers learn customers learn - codify business rules/goals Feedback Is the Fundamental Tool Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Test-Driven Development in a Nutshell Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

whereas running tests: Writing tests: makes us clarify the acceptance criteria for the system encourages us to write loosely coupled components, so they can easily be tested in isolation and, at higher levels, combined together adds an executable description of what the code does adds to a complete regression suite whereas running tests: detects errors while the context is fresh in our mind lets us know when we’ve done enough, discouraging “gold plating” and unnecessary features (design). Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Golden Rule of Test-Driven Development Never write new functionality without a failing test. Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Refactoring. Think Local, Act Local “Refactoring means changing the internal structure of an existing body of code without changing its behavior. The point is to improve the code so that it’s a better representation of the features it implements, making it more maintainable. Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Freeman, Steve; Pryce, Nat (2009-10-12) Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Coupling and Cohesion Coupling and cohesion are metrics that (roughly) describe how easy it will be to change the behavior of some code. They were described by Larry Constantine in [Yourdon79]. Elements are coupled if a change in one forces a change in Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Coupling Elements are coupled if a change in one forces a change in the other For example, if two classes inherit from a common parent, then a change in one class might require a change in the other. Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Cohesion Cohesion is a measure of whether its responsibilities form a meaningful unit. For example, a class that parses both dates and URLs is not coherent, because they’re unrelated concepts. Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Object Oriented Music is the space between the notes. —Claude Debussy The big idea is “messaging” [...] The key in making great and growable systems is much more to design how its modules communicate rather than what their internal properties and behaviors should be. - Alan Kay [1998] Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

An object communicates by messages: An object-oriented system is a web of collaborating objects. A system is built by creating objects and plugging them together so that they can send messages to one another. Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Man is a tool-using animal Man is a tool-using animal. Without tools he is nothing, with tools he is all. —Thomas Carlyle Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

NUnit Behaves Differently from JUnit .Net should note that NUnit reuses the same instance of the test object for all the test methods, so any values that might change must either be reset in [Setup] and [TearDown] methods (if they’re fields) or made local to the test method. Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Test Fixtures A test fixture is the fixed state that exists at the start of a test. A test fixture ensures that a test is repeatable— every time a test is run it starts in the same state so it should produce the same results. Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Test Fixture Example public class CatalogTest { final Catalog catalog = new Catalog(); final Entry entry = new Entry(" fish", "chips"); @ Before public void fillTheCatalog(){ catalog.add( entry); } @ Test public void containsAnAddedEntry() { assertTrue( catalog.contains( entry)); @ Test public void indexesEntriesByName() { assertEquals( equalTo( entry), catalog.entryFor(" fish")); Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

assertNull( catalog.entryFor(" missing name")); } @ Test( expected = IllegalArgumentException.class) public void cannotAddTwoEntriesWithTheSameName() { catalog.add( new Entry(" fish", "peas"); } Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests

Freeman, Steve; Pryce, Nat (2009-10-12) Freeman, Steve; Pryce, Nat (2009-10-12). Growing Object-Oriented Software, Guided by Tests