Home | About Us | Stelligent  

TestEarly Weblog

Developer Testing

Developer Testing and News and Training and /Duvall23 Mar 2009 08:04 am

My friend Andy Glover will be leading a two-day training class in Reston, VA on April 2nd and 3rd, 2009. If you haven’t attended any of Andy’s training sessions, you’re missing out. Having worked with Andy for several years, I can tell you first hand that he’s got unique combination of depth and breadth in technical skills…while making the material he’s covering extremely interesting. The two-day course contains 16 hands-on labs, so you’re not just walking out with a bunch of theory. Therefore, if you want to get up to speed with Groovy and Grails in a short amount of time, I highly recommend you register for this course.

Groovy logo

Groovy is a dynamic language that runs on the Java platform. It makes programming easier and more powerful, while taking advantage of everything that’s been built up around Java. Grails is a framework, built on Groovy, to help you quickly develop web-based applications.

Developer Testing and News and Training and /Duvall23 Mar 2009 08:04 am

My friend Andy Glover will be leading a two-day training class in Reston, VA on April 2nd and 3rd, 2009. If you haven’t attended any of Andy’s training sessions, you’re missing out. Having worked with Andy for several years, I can tell you first hand that he’s got unique combination of depth and breadth in technical skills…while making the material he’s covering extremely interesting. The two-day course contains 16 hands-on labs, so you’re not just walking out with a bunch of theory. Therefore, if you want to get up to speed with Groovy and Grails in a short amount of time, I highly recommend you register for this course.

Groovy logo

Groovy is a dynamic language that runs on the Java platform. It makes programming easier and more powerful, while taking advantage of everything that’s been built up around Java. Grails is a framework, built on Groovy, to help you quickly develop web-based applications.

Developer Testing and News and Training and /Duvall23 Mar 2009 08:04 am

My friend Andy Glover will be leading a two-day training class in Reston, VA on April 2nd and 3rd, 2009. If you haven’t attended any of Andy’s training sessions, you’re missing out. Having worked with Andy for several years, I can tell you first hand that he’s got unique combination of depth and breadth in technical skills…while making the material he’s covering extremely interesting. The two-day course contains 16 hands-on labs, so you’re not just walking out with a bunch of theory. Therefore, if you want to get up to speed with Groovy and Grails in a short amount of time, I highly recommend you register for this course.

Groovy logo

Groovy is a dynamic language that runs on the Java platform. It makes programming easier and more powerful, while taking advantage of everything that’s been built up around Java. Grails is a framework, built on Groovy, to help you quickly develop web-based applications.

Developer Testing and Continuous Integration and Business Perspectives and /Duvall11 Feb 2009 07:10 pm

I like repeatable processes. To me, it’s a waste of time to do the same thing more than once. I’m also reminded of this when I start repeating answers to the same questions. When considering knowledge companies, virtually everything valuable to us are our people and information, not physical assets. As I said in “Fire your Best People…”, if information is locked inside someone’s head, they are a less valuable resource. It’s all about sharing: files, knowledge, pertinent information from emails and so on. If the asset only exists on one person’s machine, or worse: their head, and is relevant to others, your company has a problem.

My Library of Information

When considering software, if all of the assets necessary to create working software haven’t been committed to the version-control repository, the software doesn’t exist. Sounds simple doesn’t it? Then, why do so many projects and companies fail to follow this simple rule? If I was cynical, I might think it’s because some think that by harboring this information, they can essentially hold the organization “hostage” - and increasing job security. In my experience, this is no longer the primary reason in the organizations I’ve seen (although there are always a few exceptions). I think the main problem is leadership. It takes discipline for each person in an organization to ask themselves after they’ve sent instructions on how to do something in an email…

Is this something I want to keep permanent for all current and future employees?

Other examples include:

  • Realizing that a configuration file used to deploy the software should be checked into the version-control system so that the software can be built in any target environment, not just on their machine.
  • The workaround for that strange bug in your Content Management System should be posted to the Wiki
  • That pointing to a file in a version-control repository may be preferred over sending email attachments with every change .
  • The email that documented the steps that Human Resources performs when a new employee starts with the company, should be published to the company’s Intranet .

Here are some possible tools where you might capture these assets:

  • Version-control repository
  • Corporate Intranet
  • Hosted Wiki
  • Electronic Corporate bulletin board
  • Company blog

Leaders in knowledge organizations understand their most vital assets are their people and the information produced by these people. When people leave, you need to have a way to continue to leverage this knowledge. Leaders understand that this philosophy of sharing information must be institutionalized. Just remember…

If it’s not in the System, it doesn’t exist

Developer Testing and /Duvall24 Sep 2008 07:14 am

easyb-imageLast week, JavaLobby published an article about easyb called “Is easyb Easy?”.

Yes, that’s exactly what you will find out by reading this article. easyb is a BDD framework for the Java platform written by Andrew Glover. This article goes in detail about how to write a

1. Scenarios within Stories
2. Run these Stories from Ant
3. Generate a report.

Check out the article to find out what the verdict was. Also, give it a try and let us know your verdict as well.

Developer Testing and /Duvall24 Sep 2008 07:14 am

easyb-imageLast week, JavaLobby published an article about easyb called “Is easyb Easy?”.

Yes, that’s exactly what you will find out by reading this article. easyb is a BDD framework for the Java platform written by Andrew Glover. This article goes in detail about how to write a

1. Scenarios within Stories
2. Run these Stories from Ant
3. Generate a report.

Check out the article to find out what the verdict was. Also, give it a try and let us know your verdict as well.

Developer Testing23 Sep 2008 02:39 pm

http://wondermark.com/d/445.html

Developer Testing and Build Management and Tutorial and Agile and /Duvall23 Sep 2008 07:02 am

gant-imageYes, this is exactly what I am frequently asked by my clients and many developers. It isn’t easy to answer this question. There are several projects using Ant. Should you run away from Ant just because there is a new cool tool out there called Gant? Should you switch to Gant just because you dislike XML? Not at all. Let’s take a closer look and see what might make you switch to Gant.

When to choose Gant?

1. Complicated Build Files. If your ant build files are becoming too complicated, and hard to manage, it’s time to see if using Gant can help. Let me explain what I mean by complicated build files. If you have too much of conditional logic within your build files, say something similar on the lines shown below in Listing 1:

Code Listing 1:


    <if>
      <isset property="sqlserver"/>
      <then>
        <do something here/>
      </then>
    </if>
    <if>
      <isset property="oracle"/>
      <then>
        <do something else here/>
      </then>
    </if>
    <if>
      <isset property="derby"/>
      <then>
       <do something for derby here/>
      </then>
    </if>
    <if>
      <isset property="db2"/>
      <then>
        <do something for db2 here/>
      </then>
    </if>

Or even something like this where you might be supporting deployment to different application servers based on some property in your build.properties or by the user as shown in listing 2.

Code Listing 2:

    <if>
      <isset property="server.jboss4"/>
      <then>
        <deploy to JBoss 4/>
      </then>
      <elseif>
        <isset property="server.weblogic10"/>
        <then>
	<deploy to web logic/>
        </then>
      </elseif>
      <elseif>
        <isset property="server.glassfish"/>
        <then>
          <deploy to GlassFish/>
        </then>
      </elseif>
      <elseif>
        <isset property="server.someother version"/>
        <then>
          <deploy to this some other version/>
        </then>
      </elseif>
    </if>

Things get out of hand when you have conditional logic as shown above in your build scripts. The listings I have are just the skeleton, imagine what happens when we start adding the actual deployment logic for all these application servers. It doesn’t matter how you refactor this, it is still going to be very complicated. Trust me, I have written build scripts which were several thousand lines, and refactoring them was not a trivial task.

2. Custom Ant Tasks. I myself am guilty of writing many of these. There are many situations which arise in projects where we create custom ant tasks. It is simple once you know how to write one, and than for every complicated task you need to perform, you involuntarily will start writing custom ant tasks.

Anyone writing a custom ant task will:
a. Create a new class that extends Ant’s org.apache.tools.ant.Task class.
b. For each attribute, write a setter method.
c. Write an execute()method that does what you want this task to do.

There isn’t anything wrong in doing the above, but imagine each time you want to make a small change you will have to make changes within your Java source code, compile, test, re-package.

3. Scripting. You can extend Ant further by not writing custom ant tasks, but by using small snippets of code written in an interpreted language like JRuby, BeanShell, or Groovy. These code snippets can be placed within your build files or in separate text files. If you are using Groovy’s Ant task, your build file might look something like this:

 <groovy classpathref="build.classpath">
  import some.package
  import another.package
  def fullpath = "${.basedir}/${defaulttargetdir}"
   def somefile = new SomeFile(projectName:"${pname}",
     buildLabel:"${label}", buildTime:"${new Date()}")
   def xml = "${fullpath}/dashboard.xml"
   new File(path).write(somefile.generateReport())
   ant.xslt(in:path,
    out:"${properties.defaulttargetdir}/some.html",
    style:"${properties.defaulttargetdir}/lib/report-style.xsl")
 </groovy>

Imagine having several lines of XML in your build files which have many of these small snippets of scripts. I myself don’t like mixing and matching build files with code snippets. If you have a team where everyone is in the same page, everything works fine. What if a team member has no clue about any of the Scripting languages? He/She will have no clue how to make minor changes when things go badly. If you have all the above or even one of the above three cases, you seriously need to consider using Gant. To quote Aristotle:

For the things we have to learn before we can do them, we learn by doing them.

So, lets see how easy it is to learn Gant and see how things can improve.

This part covers some very basics of Gant. The next part, will dive deeper into Gant by using it with a sample project to build our application, and we will also see how to use it with our CI Server.

What’s Gant?

Gant is a build tool that uses both Groovy and Ant. With Gant, you describe your build process using Groovy scripts. Stated simply, Gant allows you to specify the build logic using Groovy instead of XML. The next thing you may ask is ” Is Gant a competitor to Ant?”. Let me quote from the Gant web site to make things more clear here :

Whilst it might be seen as a competitor to Ant, Gant uses Ant tasks for many of the actions, so Gant is really an alternative way of doing builds using Ant, but using a programming language rather than XML to specify the build rules.

Download and Install Gant.

In order for Gant to work, you should have Groovy installed. You can download and follow the installation instructions for Groovy here.
As I said earlier also, in order to use Gant, you should have knowledge of Groovy as well. If you have never written Groovy code before, there are many interesting books on Groovy like:

a. Groovy in Action

b. Groovy Recipes

c. Groovy Refcardz

You can also read the getting started guide on the Groovy web site, which should give you a good starting point.

Download the latest version of Gant from here. Gant is currently at version 1.4.0. Unzip it to a folder. If you already have your GROOVY_HOME set, that’s all you need to use Gant.

Getting Started.

Open a console, and type gant. You should see a message as shown below:

meera-subbaraos-macbook-9:~ meerasubbarao$ gant
Cannot open file build.gant
meera-subbaraos-macbook-9:~ meerasubbarao$

You are all set at this point to use Gant in your projects.

Help Information: Open a console, and type gant -h. This will provide you with all the necessary help information you need as shown below:

meera-subbaraos-macbook-9:CodeMetricsProject meerasubbarao$ gant -h
usage: gant [option]* [target]*
-c,–usecache Whether to cache the generated class and

perform modified checks on the file before re-compilation.
-n,–dry-run Do not actually action any tasks.
-C,–cachedir The directory where to cache generated
classes to.
-D = Define to have value .
Creates a variable named for use in the scripts and a property
named for the Ant tasks.
-L,–lib
Add a directory to search for jars and
classes.
-P,–classpath
Specify a path to search for jars and
classes.
-T,–targets Print out a list of the possible targets.
-V,–version Print the version number and exit.
-d,–debug Print debug levels of information.
-f,–file Use the named build file instead of the
default, build.gant.
-h,–help Print out this message.
-l,–gantlib
A directory that contains classes to be used
as extra Gant modules,
-p,–projecthelp Print out a list of the possible targets.
-q,–quiet Do not print out much when executing.
-s,–silent Print out nothing when executing.
-v,–verbose Print lots of extra information.

Create a new file called build.gant at the root of your project. gant-project

Did a similarity between Ant and Gant strike you here? Ant build files are usually called build.xml, and they are created as a common practice within the root of your project folder as well.

If you have written or even modified Ant build files, you will know that it contains one project element, which in turn contains a name,the default target and the base directory.

Code Listing 4:

<project name="GantSamples" basedir="." default="compile">

So for example, sayHello target in Ant would look something like this:

<target name="sayHello" description="Saying Hello">
	<echo message="Hello from Stelligent"/>
</target>

Lets create the sayHello target, and also see how to set it as the default target in Gant as well.

A Gant target has a name and a description:

Code Listing 5:
target ( target-name : target-description ) {
groovy code sequence
}

The above sayHello target in Gant would translate as shown below:
target(sayHello:"Saying hello"){
Ant.echo(message:"Hello from Stelligent")
}

Now, open a command window and type gant at the root of the project where the build.gant file exists. You should be able to see a output like:

meera-subbaraos-macbook-9:CodeMetricsProject meerasubbarao$ gant
Target default does not exist.

Gant is complaining that we haven’t set a Default target. Lets see how to do the same:

Default target: Within Ant, you define the default target from within the project element as seen in Listing 4. The default target is the target called if no target is specified from the command line. There however is no project tag within Gant. There are two ways of specifying the default target as shown below

1. You simply create a target whose name is default.
target ( 'default' , 'The default target.' ) { aTarget ( )
2. or even simply:
setDefaultTarget ( aTarget )

In order to get our sayHello target working, we need to add one of the above scirpts to our build.gant file.

Code Listing 6:
setDefaultTarget(sayHello)
or
target ("default": "The default target." ) {
sayHello ( )
}

Complete listing of build.gant:
target(sayHello:"Saying hello"){
Ant.echo(message:"Hello from Stelligent")
}
/*
target ("default": "The default target." ) {
sayHello ( )
}
*/
setDefaultTarget(sayHello)

And you should be able to see:

meera-subbaraos-macbook-9:CodeMetricsProject meerasubbarao$ gant
[echo] Hello from Stelligent
meera-subbaraos-macbook-9:CodeMetricsProject meerasubbarao$

That was easy! If you have build files and it is becoming unmanageable by your team, there is a tool out there which can convert your Ant scripts to Gant scripts as well. I haven’t used it, but you can try it here.

In this part of the series, we learned when to move over from Ant to Gant, downloaded and installed Gant, and finally wrote a simple gant build file. In the next part of this series, we will see Gant in Action within a simple Java project.

And as always, keep us posted here if you are encountering any problems getting started with Gant. Stay tuned.

Developer Testing and /Duvall22 Sep 2008 11:48 am

Roy has some provocative thoughts on TDD and getting developers to write unit tests.  I don’t agree with all of them, but it’s worth a read.
Some of his interesting points:

  • 99% of the developers out there aren’t ready for the “testability” message
  • Don’t call them ‘mocks’ or ’stubs’ - say things like ‘we need to isolate this class’
  • Unit Testing has a very high learning curve, and all the tools are making that learning curve higher
  • Try to avoid record/replay style testing
  • Don’t advocate ‘one true way’ to do unit testing.  Accept other approaches that are different from your preferred approach.

I suggest you read the whole thing.

Developer Testing and /Duvall22 Sep 2008 11:48 am

Roy has some provocative thoughts on TDD and getting developers to write unit tests.  I don’t agree with all of them, but it’s worth a read.
Some of his interesting points:

  • 99% of the developers out there aren’t ready for the “testability” message
  • Don’t call them ‘mocks’ or ’stubs’ - say things like ‘we need to isolate this class’
  • Unit Testing has a very high learning curve, and all the tools are making that learning curve higher
  • Try to avoid record/replay style testing
  • Don’t advocate ‘one true way’ to do unit testing.  Accept other approaches that are different from your preferred approach.

I suggest you read the whole thing.

Next Page »