In my company we create clinical instruments. These instruments are so expensive, and big enough to say that they are not portable. For these reasons each instrument has an
emulator, so integration tests are run without having physically any instrument.
Our e
mulator has an
XML file where all required resources for running tests are configured. In summary each file contains a list of blood barcodes, and reagent barcodes. In our case barcodes have a meaning (kind of resource, expiry date, checksum, ...).
So one can think about creating a standard configuration file that is used in integration tests. It is a good idea if you don't know that expiry date is expressed in months. So one day without knowing exactly why your tests begin to fail. The answer is obvious, resources have become expired. We need a (
script ?) that updates this
XML file so when a resource is becoming expired, its month field is changed.
Moreover not all resources should be updated. Some tests imply working with expired resources. For this reason some barcodes have special format that suggests that update should not be applied.
Because project is developed in
Java, one can think about creating a small
Java class that do all these work. But wait and think if this class would be small or not, we need a parser (
DocumentBuilder), a method that walks all nodes and see if resource is expired or not (
NodeList, Element.getAttribute(), ...), and finally writing modifications to file. Furthermore, some barcodes contains special charachtrs that should be detected using a regular expression (
Pattern,
Matcher) for avoiding its update. Although this class is not difficult, it is far away from a small class with few lines.
But how about polyglot programming?
Groovy can be a choice. Let's see how
Groovy deals with
XML and
Regular Expressions.
Imagine next
XML file:
Groovy and XML
Meanwhile in
Java you create a
DocumentBuilderFactory that returns a
DocumentBuilder, and then call
parse method, in
Groovy is as simple as:
and
root variable points to root element of
XML file.
And now imagine that you want to update all blood barcodes of given holder. With
Java you will use an iterator over
NodeList or using an
XPath expression. See the simplicity with
Groovy.
See that with
Groovy, nodes are explored as object attributes, and finally we call
findAll() method that returns a list of
sample nodes belonging to
SampleHolder11 tag. For returning an attribute value is as easy as adding
@ character before attribute name, in our case
barcode.
And for writing an
XML is as easy as:
In previous example, output is written to console.
Groovy and Regular Expressions
Remember that some barcodes have special format. In our case if any barcode starts with
A,
B,
C or
D, should not be modified. A clean, reusable and maintainable solution is using
regular expressions to check if one barcode matches or not special format. In
Java the process is not banal, you have to create a
Pattern object with a regular expression, a
Matcher and use
find() method to see if pattern is found on entry or not.
But how we can determine if one string matches a regular expression in
Groovy ?
==~ operator does the work for us. Tell me what you think about this expression:
Elementary. You will agree with me that
Groovy approach is simpler than
Java one. For specifying a pattern you only have to use
~ character plus a slash
(
/) then a regular expression and finally a slash to delimit. But
Groovy also supports
=~ (create a
Matcher) and
==~ (return boolean, whether
String matches the pattern).
I think that creating a script that
reads/parses/writes XML file is so fast and easy, not much classes are involved compared to
Java. And not worth making the comparison with
regular expression approach, in
Groovy is the simplest way one may think.
After the success of previous
Groovy script, we decided to create another tool (
Groovy script) for manipulating database.
System registers into database every incidence that has occurred to an execution. Some incidences are easy to reproduce with emulator, but others not. In integration tests there is no problem, because a defined-filled database is used, but acceptance tests contains no data and is generated with the execution of tests. But because there are some incidences that are hard to reproduce in emulator, a
Groovy script to insert incidences are created.
Groovy and SQL
As
Java,
Groovy can also access to databases and as you can suppose in a simple way. No
Connection object, no
PreparedStatement, no
ResultSet, ....
Let's see an example of searching data and using them for creating a new registry. Imagine that we have a table called
Execution and another one called
Incidence, and
one-to-many relationship.
Simple, yes? With one line a connection to database is established.
Executing
SELECT query and iterate over results are also easy. Using
eachRow method, all results are iterated. No
ResultSet object is required anymore. Parameters values are passed between brackets ([]), and as
XML each row is accessed using
Closure. In previous example each row is mapped to execution variable. Moreover see how easy is read a value of each tuple. As in
XML you access the value as a class attribute, no more
getters of
ResultSet methods, in example
execution.dboid is used to refer to
dboid field.
Finally
execute method is used to update database.
Now that I have shown you some of nice features that
Groovy offers us, I will explain you how we execute these tools.
GMaven
We use
Jenkins with
Maven as
Continuos Integration System. Before
Jenkins starts to execute
Integration Tests,
Groovy scripts are executed so e
mulator is configured propertly. The iteresting part of this step is how
pom is configured for executing
Groovy scripts.
Exists a plugin called
gmaven-plugin. This plugin runs
Groovy scripts depending on phase and goal.
No problem configuring
gmaven plugin, the most important part is where you specify which script should be executed.
As final notes I want to say that I am a huge fan of
Java and my intention is not criticize it, but I think that there are some problems that are best suited using other languages rather than
Java. My advice is learning as many kind of languages as you can (
Scala,
Groovy, ...) so as programmer you can choose the best solution to a given problem.
I wish you find this post useful.
Music:
http://www.youtube.com/watch?v=9u54Xs22_SI