Friday, November 12, 2010

Automated Testing VS. Unit Testing

I often hear the terms Automated Testing and Unit Testing used in a context that implies that they are one in the same. Lumping these buzz words is misleading and can scare people away from implementing simple automated testing techniques.

Let me describe the two terms with out all the mumbo jumbo and TDD propaganda...

Unit Testing: Testing each part of your code at a granular level.

Automated Testing: Testing by using an automated process that can report success or failure.

Don't assume that to implement automated testing you need to start writing unit tests against all of your code. This is daunting and involves effort, planning, and a shift in paradigm. This is why most development teams shy away from automated tasting. In reality, there are much lower hanging fruit in the automated testing world than unit testing....



Suppose your application is supposed to output 10 folders into C:/web/, each with an html, javascript, and css file within them. So whenever you change your source code, you verify that everything still outputs. So your manually testing your code via something like this:
  1. Delete C:/web/
  2. Run your app with correct params
  3. Open C:/web/
  4. Verify folders and files exist
  5. Verify that there is data in the files
This is a fairly tedious test that could easily be automated. JUnit would be a great tool for this (Junit has an unfortunate name because it implies it is only for unit testing.) You could easily create a JUnit test that would do each step for you, and then display green for success or red for failure.

If your not yet doing automated testing, try to think of tasks that you do during development and testing that could be automated, forget about unit testing for now. Check out this article to learn how to create automated tests using JUnit. Like most it focuses on unit testing, but don't get hung up on that.

Monday, October 18, 2010

Removing line breaks in XSLT

I needed to remove the line breaks from my transform output because they were interfering with a 3rd party transform engine. (I could not use normalize-space(.) because I needed to preserve the spacing around mixed content.)

Instead of finding what the carriage return code is (I believe its #xD). I just created the variable $linebreak with the value of an actual linebreak.

The original code:
    <xsl:template match="para/text()">
<xsl:value-of select="."/>
</xsl:template>


Updated to remove line breaks:

<xsl:template match="para/text()">
<xsl:call-template name="selectWithoutBreaks"/>
</xsl:template>


Utilizes these templates:

<xsl:template name="selectWithoutBreaks" >

<!-- NOTE: The whitespace between the xsl:text elements is important because it represents the line break -->
<xsl:variable name="linebreak">
<xsl:text>
</xsl:text>
</xsl:variable>

<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="replace" select="$linebreak" />
<xsl:with-param name="with" select="''"/>
</xsl:call-template>
</xsl:template>

<xsl:template name="replace-string">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="with"/>
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:value-of select="substring-before($text,$replace)"/>
<xsl:value-of select="$with"/>
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="substring-after($text,$replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="with" select="$with"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>


This is all possible in XSLT 1.0. If you are using XSLT 2.0 you can use the replace function instead of creating the replace-string template above.

Monday, October 4, 2010

Great tool for comparing multiple files

I had applied some "hotfixes" to some of our XSLT production code without ever building a new installer. This caused the files in production to get out of sync with what I had in my development environment and in Source safe.

I needed a way to compare multiple files at once because it would of taken forever to go one by one, and I did not want to just guess based on the modified date.

Luckily I found a free tool called KDiff3. I highly recommend this tool, it works just as expected and can potentially save you a lot of time when troubleshooting.




Download it here: http://kdiff3.sourceforge.net/

Does anyone have experience with any other compare tools? After trying KDiff3 I did not bother looking any further because the tool worked so well.

Thursday, August 5, 2010

Remap Capslock to behave as a Control Key


The Capslock key is near useless and causes more harm then good. But there is good news; it only takes a minute to turn your Capslock into a Control key.

  1. Open Regedit.exe (Start->Run: regedit or Type regedit in the Windows 7 "Awesome Bar")
  2. Browse in the Registry Editor to: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

  3. Click Edit->New->Binary Value and name it "Scancode Map"
  4. Double click Scancode Map and set the value to:
    00,00,00,00, 00,00,00,00, 02,00,00,00, 1d,00,3A,00, 00,00,00,00

Thats it! After restarting your computer your Capslock key will function as a Control key instead.

For a more in depth look at key remapping in Windows please see this How-To-Geek article.


P.S. Chuck Norris does not have a Control key on his keyboard.... (he is always in control).

Thursday, July 15, 2010

Lifecycle permissions in Documentum "You must be the owner (or superuser)"

I work on a content management system run off of EMC's Documentum. We had a new requirement that users be able to move our modules into different folders.

But every time we tried to move a module, we encountered the following error:


[DM_SYSOBJECT_E_NO_RELATE_ACCESS]error: "No relate access sysobject named 'product_lifecycle'."

I thought... "Why does it care about a lifecycle, I am not modifying the lifecycle, I am just moving the document." But it turns out that the permissions on a lifecycle do not control the permission on the lifecycle itself, they control the permission on the document that it is attached to. So in order to move a document, you must have the write and relate permissions on not only the document's permission set, but also the applied lifecycle.

We did not know this when creating the lifecycle. The lifecycles permissions were much to restrictive. And you cannot edit an installed lifecycle's properties through Webtop. What a pain...

But wait! Have no fear, you do not you do not need to uninstall it and redeploy it with the Documentum Application builder. You can just do the following steps:
  1. API>uninstall,c,46002af8801037ae
  2. Now it is uninstalled so update the permissions on the lifecycle easily using the properties->permission screen.
  3. API>install,c,46002af8801037ae
(Where 46002af8801037ae is the Object ID of the lifecycle).

You now have the correct permissions on your lifecycle and as long as you have the correct permissions on your documents ACL you will be right as rain.

Wednesday, June 9, 2010

Do NOT Use Javascript to Output Content

Javascript is ever increasing in popularity as a tool for web developers. But it can be dangerous.

Reasons for popularity:
  • Availability of great javascript libraries.
  • Increasing popularity and new uses for AJAX.
  • Increasing user acceptance.
  • Increasing browser support.
  • HTML5 and lack of support for Flash on iPhone/iPad
Overall, javascript is fantastic. It can provide users with a richer, cleaner, and more responsive experience, while saving resources on the web server.

But because it has become so easy to use javascript, developers are using it for something that it should not be used for: outputting content.

So you might be thinking...
"Why does it matter how we output our web content? It looks the same to the user as long as they have javascript turned on, and this is 2010 who doesn't enable javascript in their browser?!?!"

Well, the most important user in the world Mr. Gle does not use javascript. First name Goo by the way.

So your website looks beautiful, you have your wonderfull content on your 6 dozen pages that you worked so hard on. All of them have great headings and title tags and you followed all the other advice you found about SEO. But guess what, thats not what Mr. Gle sees. He sees 72 pages of spam. This is because for all Mr. Gle knows (Google if you haven't gotten it yet) you have created 72 identical pages and repurposed their titles to try and hit more direct keywords. An SEO spam tactic that is similar, but worse than what Jason Calacanis and his guys at Mahalo got in trouble for.


I know its tempting to use an AJAX call to output some database content onto a silver plate for your users. But you must not do so. All content on web pages should be static html that is generated on the server side.

Don't feel bad if you made this mistake because we did the same thing for our startup project Nofouls.com. Our area feed messages are all output by javascript, so Google does not give a &!#@ about them. Therefor all of our city pages (we have about 100) look almost exactly the same to Google. (Sorry Google we are not trying to be evil!)

Sure the content looks decent. But its output by javascript so it really hurts our image in Google's eyes.

In conclusion, just remember that just because javascript may be an easy and clean way to output your content, it is never the right choice.