Tuesday, March 09, 2010

JMeter scripts for continuous integration


A client needed to move from Oracle to Microsoft Sql Server and wanted to make sure MS sql server will work as fast as Oracle does.
We used JMeter to record various scenarios from our web application for benchmarking against two different databases.

After tuning sql server a bit we have seen dramatic performance improvements and by re-running our recorded tests we could keep track of our progress.

Jmeter scripts can be executed from ant and maven builds. It is very good idea to run jmeter scripts as part of continuous integration process at least once a day.

JMeter allows inserting assertions against the response you get back from server by regular expression matching. So in theory scripts can verify json, xml responses. As a result, you can position those scripts as integration tests as well as performance tests.


Hudson has a performance plugin that can execute jmeter tests and report performance and robustness trend of the application.
This way you can measure performance trends of stable development environments (e.g pre-production servers) as development patches are applied to them. 

One easy way to record web application interaction and place assertions against html responses is to use Badboy.
BadBoy is an  capture/replay interface which can export as jmeter scripts.


There are many ways to test/benchmark request-response exchange, this is just one of them. What other tools & techniques do you use to track performance and stability trend of web applications?

Monday, March 01, 2010

Job Opportunity in Istanbul,TR

A dear friend asked me to pass on the word. 


If you are in Istanbul and want to work with a very good team on latest java technologies to create state-of-the-art telecom software.

Here is your chance.

 

Sector: Telecom.

  

Experience: 2-4

Specialities:  


- javaEE
- JSF
- EJB3
- Quartz
- GridGain (optional)
- jboss 5.X
- web service(metro 1.5+)


Send resumes to jobs.istanbul@gmail.com 


Thursday, February 25, 2010

Code Katas



A Code Kata is an exercise in writing code preferably in test driven way, which you do repeat periodically.

There are very good examples of them around the Internet


It generally takes 15 to 20 minutes to finish for the first time, after a few cycles duration goes down by almost by half .
Every time I repeat , I find new shortcuts in my development environment and a few things to do differently.

Here are some of my favorites.


I prefer Java but intend to write some of them in Scala Ruby and Groovy.

Wednesday, February 17, 2010

Virtual development environments


Using virtual machines to maintain development environments ( development ide to application server config) is becoming a common practice.
8-core cpus, 4+ gb rams and 64 bit operating systems allow running guest operating systems without a lot of performance penalties.

What should be in a baseline image?

  • Notepad alternative
  • Continuous integration server running unit tests of your project (e.g Hudson)
  • IDE (Eclipse or Netbeans) and plugins
  • Static code analyzers with customized ruleset of your team (integrated with IDE) e.g PMD, FindBugs
  • Application server (integrated with IDE) (Glassfish)
  • Database server with initial data loaded.
  • Load generator with sample scenarios (e.g Apache Jmeter)
  • Cache server (memcached)
  • Any other frameworks your project needs (e.g Grails)
  • SQL client (depends on your db)
  • Source control client (SVN or git client)


There are a lot of advantages
1- Common virtual machine image to get new members of team running up in short time.
2- No need to change settings between clients and projects

For virtualization, I prefer VirtualBox. Vmware is another alternative and so is Parallels in Mac OS X.

What other tools do you install as baseline for virtual systems?







Tuesday, February 16, 2010

Single responsibility principle

Single responsibility principle

Recently i needed to compile our all jasper-report files during application start-up.
I was modifying existing code-base to enable precompiling xml reports to binary .jreport files.

It was simple enough, traverse all *.jrxml files at a certain directory and use net.sf.jasperreports.engine.JasperCompileManager to do the actual compiling.

Here is how i traversed all files under a directory.

    private void visitAllFiles(File dir)  {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
visitAllFiles(new File(dir, children[i]));
}
} else {
//doSomething();
}
}


Here is what is wrong with this version.

The infrastructure logic to traverse the files and business logic to compile reports resides in same class.
If i needed traverse files for something else (for example to backup old compiled reports) i would need to duplicate infrastructure logic.
It seems this class is trying to do too many things. I separated this class to a reusable FileCrawler and FileVisitor.
 
public interface FileVisitor {
void visit(File fileToProcess) ;
}

FileCrawler takes a visitor and calls visit method for each file it encounters.

     
public FileCrawler(final File root, final FileVisitor visitor) {
this.visitor = visitor;
}

private void visitAllFiles(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
visitAllFiles(new File(dir, children[i]));
}
} else {
visitor.visit(dir);
}
}

Usage is as follows:

  new FileCrawler(new File(this.cacheFilePath), new ReportCompiler()).start();


ReportCompiler implements FileVisitor and looks like as follows:


public void visit(File fileToProcess)  {
String name = fileToProcess.getName();
if (name.endsWith(".jrxml")){
compileReport(fileToProcess.getParent(),name);
}
}

Now i can  use anonymous inner classes to create simple reusable directory traversing logic.

new FileCrawler (new File (root), new FileVisitor() {
public void visit(File fileToProcess) {
String name = fileToProcess.getName();
if (name.endsWith(".jreport")){
fileToProcess.delete();
}
}
});