Agile Testing Days 2010 coming up

Speaker at Agile Testing Days 2010

I'll Be There


In about six weeks I’ll give a talk at Agile Testing Days together with Emily Bache. The talk’s title is set to “The Coding Dojo
as a forum for teaching TDD” and we are last to speak on Wednesday before the final key note of the day (and the “chill out” event). I’m looking forward to the conference which I’m sure will be full of insights and rewarding in many ways.

Bok: Test-Driven Development

Test-Driven Development By Example

av Kent Beck

ISBN: 9780321146533

Detta är en bok som i tre steg visar hur Kent Beck tycker man skall skriva kod. Boken är lättläst, enkel att förstå och Beck är ganska tydlig i vad  han menar och hur han föreslår att man skall jobba.

Min behållning av boken är den lilla privata lappen med “test att skriva” – något som han alltså förespråkar men som jag själv aldrig använt i större utsträckning. Jag petar istället ner alla test-idéer i kod, typ:

// FIXME: testa null

Om jag skall ge mig på att sammanfatta vad han förespråkar så är det:

  • börja litet
  • använd en lista där du skriver upp testfall som du vet eller kommer på behöver testas
  • låt design växa fram
  • använd refaktoreringssteget till att skriva den riktiga implementation
  • misslyckas man med ett stort test, skriv ett mindre istället
  • få hellre ett test till att gå igenom än att ha vacker kod

Jag rekomenderar boken till någon som har ett hum om vad TDD är men som inte sett hur det kan fungera i praktiken. Kodexemplen är visserligen ganska lätta men det intressanta är att se hur han jobbar med problemlösning, vad TDD-metodiken ger och att det banne mig inte är svårt att börja.

Build.version

Med hjälp av MANIFEST

<build><plugins><plugin>
				<groupid>org.codehaus.mojo</groupid>
				<artifactid>maven-buildnumber-plugin</artifactid>
				<version>0.9.6</version>
				<executions>
					<execution>
						<phase>validate</phase>
						<goals>
							<goal>create</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
</plugins></build>

Denna plugin kräver att man satt upp SCM ordentligt så att versionnummer kan hämtas därifrån!

<build><plugins><plugin>
				<groupid>org.apache.maven.plugins</groupid>
				<artifactid>maven-war-plugin</artifactid>
				<version>2.0</version>
				<configuration>
					<archive>
						<manifestentries>
							<implementation -Build>${buildNumber}</implementation>
						</manifestentries>
					</archive>
				</configuration>
			</plugin>
</plugins></build>
	private String readBuildNumber(ServletContext servletContext) {
		try {
			URL resource = servletContext.getResource("/META-INF/MANIFEST.MF");
			InputStream manifestStream = resource.openStream();
			Manifest mf = new Manifest(manifestStream);
			Attributes atts = mf.getMainAttributes();
			String value = atts.getValue("Implementation-Build");
			if (value == null) {
				throw new IllegalArgumentException("Implementation-Build attribute is not set in MANIFEST " + resource.toExternalForm());
			}
			manifestStream.close();
			return value;
		} catch (Exception e) {
			throw new IllegalStateException("Failed to read Implementation-Build attribute from MANIFEST.MF");
		}
	}

Eller som vanlig resource (properties)

<build>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
</build>

assertThat(Hamcrest).looksNice();

I väntan på David Saff’s alternative assertThat(x).y() så nöjer jag mig med:

public class EmptyMatcher extends TypeSafeMatcher&lt;Collection < ?>> {
 
    @Override
    public boolean matchesSafely(Collection< ?> c) {
        return c.isEmpty();
    }
 
    public void describeTo(Description desc) {
        desc.appendText("empty");
    }
 
    @Factory
    public static lt;T> Matcher< ? super Collection<?>> isEmpty() {
        return new EmptyMatcher();
    }
}

som gör att man kan skriva trevlig enkelt läsbar kod, t ex:

@Test
public void filteringAnEmptyListReturnsAnEmptyList() {
    List anEmptyList = new ArrayList();
    List result = testee.filter(emptyList());
    assertThat(result, isEmpty());
    // men helst: assertThat(result).isEmpty();
}