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.
Month: August 2010
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
org.codehaus.mojo
maven-buildnumber-plugin
0.9.6
validate
create
Denna plugin kräver att man satt upp SCM ordentligt så att versionnummer kan hämtas därifrån!
org.apache.maven.plugins
maven-war-plugin
2.0
${buildNumber}
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)
src/main/resources
true
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<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();
}