CSCE 747 Software Testing and Quality Assurance

CSCE 747 Software Testing and Quality Assurance

CSCE 747 Software Testing and Quality Assurance Tools 12 Hamcrest 10/02/2013 Tools - Hamcrest 1 CSCE 747 Fall 2013 1 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/ Tools - Hamcrest 2 http://en.wikipedia.org/wiki/Mockito CSCE 747 Fall 2013 Tools - Hamcrest 3 http://code.google.com/p/hamcrest/wiki/Tutorial

CSCE 747 Fall 2013 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. Tools - Hamcrest 4 http://code.google.com/p/hamcrest/wiki/Tutorial

CSCE 747 Fall 2013 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

Tools - Hamcrest 5 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 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));

Tools - Hamcrest 6 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 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 Tools - Hamcrest 7 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 Object

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 Tools - Hamcrest 8

http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 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 Tools - Hamcrest 9 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 Text equalToIgnoringCase - test string equality ignoring case equalToIgnoringWhiteSpace - test string equality ignoring differences in runs of whitespace containsString, endsWith, startsWith - test string

matching Tools - Hamcrest 10 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 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)). Tools - Hamcrest 11 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 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())); } Tools - Hamcrest 12 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013

isNotANumber Implementation package org.hamcrest.examples.tutorial; import org.hamcrest.Description; import org.hamcrest.Factory; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; Tools - Hamcrest 13 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 public class IsNotANumber extends TypeSafeMatcher {

@Override public boolean matchesSafely(Double number) { return number.isNaN(); } public void describeTo(Description description) { description.appendText("not a number"); } @Factory public static Matcher notANumber() { return new IsNotANumber(); } } Tools - Hamcrest 14

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

CSCE 747 Fall 2013 Sugar generation 1. create an XML configuration file listing all the Matcher classes Tools - Hamcrest 16

http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 2. Run the org.hamcrest.generator.config.XmlConfigura tor command-line tool that comes with Hamcrest Tools - Hamcrest 17 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013

// Generated source package org.hamcrest.examples.tutorial; public class Matchers { public static org.hamcrest.Matcher is(T param1) { return org.hamcrest.core.Is.is(param1); } public static org.hamcrest.Matcher is(java.lang.Class param1) { return org.hamcrest.core.Is.is(param1); } public static org.hamcrest.Matcher is(org.hamcrest.Matcher param1) { return org.hamcrest.core.Is.is(param1); } public static org.hamcrest.Matcher notANumber() {

return org.hamcrest.examples.tutorial.IsNotANumber.notANumber(); } Tools -}Hamcrest 18 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 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())); } } Tools - Hamcrest 19 http://code.google.com/p/hamcrest/wiki/Tutorial CSCE 747 Fall 2013 Tools - Hamcrest 20 CSCE 747 Fall 2013

Tools - Hamcrest 21 CSCE 747 Fall 2013 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})); }

} Tools - Hamcrest 22 http://www.acgavin.com/hamcrest-and-junit4-4 CSCE 747 Fall 2013 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)); Tools - Hamcrest 23 http://www.acgavin.com/hamcrest-and-junit4-4 CSCE 747 Fall 2013 Hamcrest API Tools - Hamcrest 24 http://junit.org/javadoc/4.10/org/hamcrest/Matcher.html

CSCE 747 Fall 2013 http://hamcrest.org/JavaHamcrest/javadoc/1.3/ org.hamcrest Interface Matcher 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 Tools - Hamcrest 25 CSCE 747 Fall 2013 Tools - Hamcrest 26 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013

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 Tools - Hamcrest 27 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013

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? Tools - Hamcrest 28 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013

A complex system that works is invariably found to have evolved from a simple system that works. John Gall 2003 Tools - Hamcrest 29 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 Growing Objects Alan Kays 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. Tools - Hamcrest 30 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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, its 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 Tools - Hamcrest 31 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests

CSCE 747 Fall 2013 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 Tools - Hamcrest 32

Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 Test-Driven Development in a Nutshell Tools - Hamcrest 33 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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 weve done enough, discouraging gold plating and unnecessary features (design). Tools - Hamcrest 34 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests

CSCE 747 Fall 2013 Golden Rule of Test-Driven Development Never write new functionality without a failing test. Tools - Hamcrest 35 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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 its a better representation of the features it implements, making it more maintainable. Tools - Hamcrest 36 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 Tools - Hamcrest 37

Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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

Tools - Hamcrest 38 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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. Tools - Hamcrest 39

Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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 theyre unrelated concepts. Tools - Hamcrest 40

Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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] Tools - Hamcrest 41

Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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. Tools - Hamcrest 42 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests

CSCE 747 Fall 2013 Man is a tool-using animal. Without tools he is nothing, with tools he is all. Thomas Carlyle Tools - Hamcrest 43 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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 theyre fields) or made local to the test method. Tools - Hamcrest 44 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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. Tools - Hamcrest 45 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013 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")); Tools - Hamcrest 46 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests

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

CSCE 747 Fall 2013 Tools - Hamcrest 48 Freeman, Steve; Pryce, Nat (2009-10-12). Growing ObjectOriented Software, Guided by Tests CSCE 747 Fall 2013

Recently Viewed Presentations

  • Privacy Training for FHT Boards Association of Family

    Privacy Training for FHT Boards Association of Family

    Individuals have a right to sue outside the scheme set out in PHIPA . PHIPA says plaintiffs can sue after the IPC/O issues an order and then only for "actual harm" Court recognized Jones v. Tsige (not required to prove...
  • 1) You should walk different (4:1719) 2) This

    1) You should walk different (4:1719) 2) This

    Ephesians 5:3 Ask God and ask someone else to help you get ride all bitterness, rage and anger, brawling and slander, along with every form of malice. Ask God and ask someone else to help you get rid of every...
  • Jigs &amp; Fixtures - Weebly

    Jigs & Fixtures - Weebly

    This simple aftermarket vice can be used for multiple scenarios. It is shown here on the bed of a milling machine, but could be very easily used on the table of a drill press or on a bench top for...
  • The White Wonder Has the iPod really sparked a revolution? By ...

    The White Wonder Has the iPod really sparked a revolution? By ...

    Levy, a senior editor at Newsweek, is a prime example of the boomers who think the iPod is revolutionary. But really, they're grateful, because it's made them feel cool again. As the first generation to embrace rock, Levy's cohort faced...
  • International Geoscience Programme (IGCP) Geoscience in the service

    International Geoscience Programme (IGCP) Geoscience in the service

    We have identified the Alpine-Himalayan region as the ideal laboratory, because the archaeoseismological studies that have already taken root in the Eastern Mediterranean can be extended to neighbouring regions, most importantly south along North African shores, north into the Caucasus...
  • Project Title - Cvent

    Project Title - Cvent

    Brief Casual Summary: (the main idea expressed in my own words) Mother Nature wastes a lot of crude oil and natural gas when the fossil fuels . Rise to the Earth's surface. It collects in seeps, or pools, and then...
  • Materská škola Hemerkova 26

    Materská škola Hemerkova 26

    Materská škola Hemerkova 26 Áčaiová Oľga Pohybový program pre deti Zdravý rast a správny psychosomatický rast Osvojovať si základné pohybové návyky, schopnosti a zručnosti Posilňovať samostatnosť, rozhodnosť a zodpovednosť Zameranie projektu Športová gymnastika dievčat Rozvoj vytrvalosti a odvahy chlapcov Tréningový...
  • Optical Mineralogy in a Nutshell Use of the

    Optical Mineralogy in a Nutshell Use of the

    4) Note the rotating stage Most mineral grains change color as the stage is rotated; these grains go black 4 times in 360° rotation-exactly every 90o Glass and a few minerals stay black in all orientations These minerals are anisotropic...