Category: Tools

  • The DMV and continuous integration

    My father recently had an experience which bitterly proves that minor details can have major consequences. Last week, his insurance company mistakenly reported to the DMV that the coverage on his auto had lapsed. The DMV responded by revoking his tags within the space of 48 hours (quite speedy for them). To resolve the matter, he had to take proof of insurance to a local DMV office (in someone else’s vehicle, of course).

    Here’s how the process went, in his own words:

    1. Go to the DMV office on Academy St.
    2. Find out they only do driver’s licenses there.
    3. Go to the DMV office at Walnut and US-1. Walk up to the desk.
    4. Find out that the FS-1 form the insurance company faxed me has an effective insurance date of 3/34/05 rather than 3/24/05. It’s not acceptable.
    5. Find a pay phone to call the insurance company for a corrected form. Seems I left my cell phone at home.
    6. Get the insurance company to fax the corrected form to the DMV office I’m standing outside of.
    7. Go back into the DMV office and finish the transaction.
    8. Walk out with my sticker, new registration, and the confidence that comes with obeying our state laws.

    Suprisingly, aside from the nuisance of having to physically go to a DMV office, most of the blame for the mistake lies with his insurance company. First, their computers reported him as uninsured, which was, of course, incorrect. Second, when proof of insurance was faxed to him, the date on it wasn’t just off by a day or two… the date wasn’t even valid!

    If we assume that the insurance company used a computer to generate the form (a safe assumption), this means that one of the following must be true:

    1. Their processing is so antiquated that they’re simply filling out word processor templates; the incorrect date was human error
    2. The software they’re using isn’t smart enough to catch invalid dates
    3. The software they’re using has a good, ol’ fashioned bug

    If #1, they really should consider upgrading their systems to minimize the impact of human error. If #2, they need to consider investing in a more sophisticated software package. In my book, date validation is a fairly important feature! If #3, they were either sold lousy software or their in-house development group needs to do a better job of testing.

    Minor details can have major consequences. The best way to ensure the integrity of minor details is to test them. The best way to test something is to always run tests. The best way to always run tests is to use a continuous integration system!

    Now if only someone at my father’s insurance company would read this…

  • Google Reader Beta

    I enjoy RSS feeds. Nay, I adore RSS feeds. So you can understand my consternation at having to maintain three sets of subscriptions on my work computer, home computer, and personal laptop. The lists never seem to be in synch. What a pain!

    I discovered the solution to my problem last week. It came in the form of Google Reader, a beta version, but nonetheless still a (mostly) functional online news reader with a delicious user interface. Now all my RSS feeds are stored in one place and I can access them from any computer in the world without installing SharpReader or Attensa. (And Google knows just that much more about me.)

    Now if Google would just get with it and add a calendar…

  • Table saw won’t cut off your finger

    Noticed this digg today and immediately thought of a software parallel. The saw constantly monitors its electrical state for changes and shuts down when one is detected. Isn’t this just like Continuous Integration?

  • Free and easy way to convert Word docs to PDFs

    If you’re like me, you’ve run into situation after situation in which you’d like to convert a Word document to a PDF. While Googling for a tool to do this, though, I inevitably end up drowning in page after page of supposedly “free” converters which cost $30+ to unlock. Come on, $30 to do a simple conversion? This is the era of open source. There has to be a better way.

    Actually, there is. One way would be to install OpenOffice. It allows you to save a document directly to a PDF. This makes so much sense, doesn’t it? Which brings to mind another question… when will Microsoft add a similar feature to Word?

    If you don’t want to wait around for them to do that (and don’t have the inclination to install OpenOffice), check out these instructions for converting to a PDF by printing to a file and using a couple of free tools. It was quick and easy for me, and now I have my PDF and my $30.

  • Reconstructing web sites from cached data

    This paper written by a quartet of guys from the CS department at Old Dominion is quite fascinating. They present a software solution for recovering and reconstructing web sites from various Internet archive sources and cached search engine data. The tool is called Warrick and, while I expect I’ll never have to use it, it’s nice to know it’s there if needed.

    If nothing else, the paper gives a good overview of how web site caching actually works. And their description of the tool is quite intriguing. They must have spent a good deal of time on it.

  • Watir tips and tricks

    I’ve been using Watir for a week or so now and have (naturally) run into a couple of problems. I’ve also come up with a handy way to reference fields on a page. I thought I’d share these tips so others won’t have to spend their precious time working through ’em as I had to do.

    Problem: Watir doesn’t respect maxLength

    The first problem I found is that Watir doesn’t respect the maxLength attribute on a text field. It will happily enter 20 characters into a text field with a maxLength of 10 without complaining. This can cause problems with assertions and such. I was able to override Watir’s set(..) method with code which will throw an exception if the string to be entered into the text field exceeds the maxLength.

    Just add this code to your script if you want the same warning to show up:

    class Watir::TextField
      alias_method :set_value, :set
        def set(value)
          if (value.size > maxLength)
            fail(“The length of the string < "#{value}"> exceeds ” +
              “the max length (#{maxLength}) of the “#{name}” text field.”)
          end
        set_value(value)
      end
    end

    Problem: Watir doesn’t yet handle JavaScript alerts

    Another problem I ran into was Watir’s inability to handle JavaScript alerts and pop-ups. (It can handle pop-up browser windows fine, just not windows created with JavaScript’s alert(..) function.) There currently isn’t a very good workaround for this, but the Watir folks are working on a solution for the next release. In the meantime, they suggest using a tool call AutoIt in conjunction with Watir to automate interaction with the pop-ups. I haven’t tried this method yet.

    Tip: Abstract out textual references to page elements

    The site I’m using Watir to test changes quite frequently. I have no guarantee that a specific page element will be named the same thing for any length of time. Why, then, would I want to scatter references to the element throughout my Watir tests and be forced to change all of the references anytime the element itself is changed? My solution was to abstract out the common attributes of the element so that each element is only defined once. Then, whenever an element changes, I only have to change a single reference.

    Ruby’s “method_missing” idiom made it very, very easy to do this. I simply defined a parent for all of my test cases and added the following method definition to it:

    def method_missing(method)
      key = method.id2name
      super unless page_objects.has_key?(key)
      args = page_objects[key]
      return @ie.send(args[0], args[1], args[2])
    end

    Do you see what this does? Whenever a method which doesn’t exist in a subclass is called, method_missing is passed the name of the (non-existent) method. I take that name and use it as a key in a hash which I expect to be returned by a method called “page_objects” which is defined in a subclass. If the key exists, I grab the object from the hash and use it to call a method on Watir’s IE object (Ruby’s “send” method is the equivalent of an “exec” in other langages… it just allows strings to be interpreted as method calls and arguments).

    I then define the “page_objects” method in each of my subclasses like so:

    def page_objects
      {
      “field1” => [:text_field, :id, “my_field”],
      “field2” => [:text_field, :id, “another_field”]
      }
    end

    I can then simply reference “field1” and “field2” as if they were instance variables of my subclass. For example:

    def test_example
      field1.setContents(“Hello world”)
      assert_equal(“Booyah”, field2.getContents)
    end

    The calls to “field1” and “field2” are handled by “method_missing” since those methods don’t exist, and the magic then proceeds from there. If the actual ID of either field changes, I simply make the change in my “page_objects” method and my existing tests should all continue working. This indirection follows the DRY principle (Don’t Repeat Yourself).

    This trick would almost impossible to accomplish in Java without a large amount of bulky reflection code. Just another example of why dynamic typing is so nice.

    Hope you find this idiom as useful as I have. Happy Watir-ing!

  • Watir: Web Application Testing in Ruby

    WATIR stands for “Web Application Testing in Ruby”. Watir is a free, open-source functional testing tool for automating browser-based tests of web applications. It is pronounced water.

    I began experimenting with Watir over the weekend. I run a database-driven web site for a local non-profit group and have been looking for a good way to functionally test the site with a minimum time investment in a particular framework. I’ve had bad experiences with HtmlUnit and HttpUnit in the past and wanted a way to code the tests in Ruby. I’ve been told that the state of Watir a year ago was really awful, but apparently they’ve made lots of improvements since then because I didn’t have any trouble getting up and running.

    As a test writer, most of your interaction with Watir takes placed through the IE object which lets you open a specific URL and then make assertions about what the page should look like. Watir’s flexibility in looking up data on the page is phenomenal. You can do lookups by name, ID, position, and so on. The pages I’ve tested thus far contain light JavaScript so I’m not sure how well Watir performs on pages with heavy scripting, but for my purposes Watir made it quick and easy to write tests that didn’t contain an enourmous amount of code, yet were powerful enough to thoroughly verify the functionality of my web app.

    Couple Watir with ActiveRecord and you have a powerful way to verify that data on the backend is getting written and updated correctly from your web application.

    I highly recommend you check out Watir for your next project. If you end up using it, feel free to share your thoughts about it by posting a comment here or e-mailing me directly. I’d enjoy hearing from you.

  • Sails: Simplifying Java web apps

    Sails: a dynamic, open-source web framework for Java designed in the spirit of Rails.

    The top 5 reasons to use it?

    1. Created using test-driven development (no, seriously, it was!)
    2. Controllers are testable (oh yeah)
    3. Leans heavily on convention over configuration (Rails anyone?)
    4. Binds URLs to Actions on Controllers and renders their templates (sure wish Struts would do this sans XML)
    5. Converts objects into Strings and Strings into objects (sure, Struts does this, but Sails does it better)

    Born out of a software project some of my old co-workers from RoleModel Software are currently working on, this framework appears to be quite slick, but is still in its infancy. My experience with it so far has been limited, but I like what I see. I encourage you to at least poke around the Sails web site and read up on the framework.

  • Cleaning up on the web with AJAX

    Forbes.com hops on the AJAX bandwagon with a brief overview of what some new businesses are using it for. I found the point at the end about AJAX impacting Nielsen/NetRatings statistics particularly interesting.

  • Decoding COM HRESULT error codes

    As I mentioned in a previous post, I’m currently slogging through the melancholic mire of testing .NET/C# code. In the process, I’ve been receiving exceptions which give an HRESULT code in hex (i.e. 8×80020005) and not much else. That got me to wondering what these HRESULTs are and how to decode them. This wondering led me in turn to this page which has an excellent overview of what HRESULTs are and why they matter. I also uncovered a link to a freeware tool called HR Plus which can decode HRESULTs and give you a (usually helpful, sometimes vague) idea of what they mean. Both the page and the tool have been extremely handy to have around. I hope they prove handy for you too.