Download Spring, Hibernate, FitNesse... public void process()

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Concurrency control wikipedia , lookup

Relational model wikipedia , lookup

Clusterpoint wikipedia , lookup

Database model wikipedia , lookup

Object-relational impedance mismatch wikipedia , lookup

Transcript
Effective Test Driven
Database Development
Gojko Adzic
http://gojko.net
[email protected]
Database somehow
always sticks out
Lots of teams struggle with
Database testing...
Bad tools
 Inherently hard to test
 O/R Mismatch
 Changes are persistent
 Attitude of DB Specialists

Full build with all integration
tests is the only thing you
can really trust
...but it is not the most practical thing to run all the time
DB management
Dedicated instances for
developers are best
 One development DB can also
work ok
 Build + n*integrations must
always be separate

Don't count on the DB being empty
Tests will be much more effective if
they can ignore trash
Generate the glue code and bring
the two worlds closer together
Don't fight against database
features, use them!
Run tests in transactions!
...Spring, Hibernate, FitNesse...
Declarative transactions, ORM
controls the database...
 So change the test runner and use
the automation to your advantage...


!define TEST_RUNNER {test.RollbackServer}

http://gojko.net/2008/01/22/spring-rollback/
...Spring, Hibernate, FitNesse...
public void process() {
ApplicationContext ctx = new
FileSystemXmlApplicationContext("lib/test.xml");
RollbackBean rollbackProcessingBean = (RollbackBean)
ctx.getBean("rollback");
try {
while ((size = FitProtocol.readSize(socketReader)) != 0) {
try {
rollbackProcessingBean.process(
new DocumentRunner(size));
} catch (RollbackNow rn) {
print("rolling back now" + "\n");
}
}
} catch (Exception e) {
exception(e);
}
}
...Spring, Hibernate, FitNesse
public class RollbackNow extends RuntimeException
{ }
public class RollbackBean{
@Transactional
public void process(Runnable r){
r.run();
throw new RollbackNow();
}
}
Isolate non-transactional tests and
run them overnight
Do not depend on the order
of test execution
Prepare everything you need for an
isolated test
Prepare everything you need...


Known state of small development databases

Link to files

Trash and restore DB
Start with a clean DB and Load data with
DbUnit

Set up data for a specific test and roll back later

Ideally don't suppose that the DB is empty
ORM is not magic!
DBFIT: Test Driven DB Development
Made Easy
FIT+FitNesse+DB Fixtures
http://fitnesse.info/dbfit
http://sourceforge.net/projects/dbfit
Why DbFit?

Manipulate data in a relational model

Provides all the plumbing


Transaction management

Smart features based on meta-data

Parameter mapping

“wizards” for regression tests
Because it runs inside FitNesse, already
integrated with a lot of other tools/libraries
Use DbFit to:

Write and execute DB Unit tests

Prepare/verify Java or .NET integration tests

.NET: Sql Server, Oracle, (DB2)

Java: Mysql, Oracle, (DB2, SQL Server, Derby)
Simple commands

Execute procedure

Query

Execute

Insert

Update
FitNesse symbols directly mapped
to bind variables

Retrieve auto-generated keys and use them
directly

<< and >> available in Java as well

Already mapped to bind variables
Advanced features

Inspect queries, tables or procs to automatically
generate test tables and regression tests

Store and compare queries

Standalone mode for full control
Image credits

http://www.flickr.com/photos/seantubridy/

http://www.flickr.com/photos/aasta/

http://www.flickr.com/photos/guiniveve/

http://flickr.com/photos/annevoi/

http://www.flickr.com/photos/chaspope

http://www.flickr.com/photos/massenpunkt

http://www.flickr.com/photos/night_heron

http://www.flickr.com/photos/80336234@N00/4
76588081/
Q&A

... or just bug me later

[email protected]

http://gojko.net

http://twitter.com/gojkoadzic