You are currently browsing the AJAX archives.

Test Driven Javascript with QUnit

For the past year I have been using jQuery Mobile for developing web based mobile applications leveraging HTML5, CSS3 and JavaScript. Like all UI implementations, meaningful test coverage is essential to ensuring requirements have been met and refactoring can be achieved with confidence. Building applications for the Mobile Web is no different in this respect. And so, a high quality Unit Testing framework is as essential to the success of Mobile Web Applications as it is to their Desktop counterparts.

Why QUnit?

While there are quite a few good JavaScript Unit Testing Frameworks available, Jasmine in particular, I have found QUnit to best suit my particular needs for implementing Test Driven Development in JavaScript based on it’s clean design and practical implementation.

A Simple, Powerful API

The power of QUnit lies in it’s simple and a rather unique approach to Test Driven Development in JavaScript. The QUnit API introduces a few slightly different test implementation concepts when compared to the more traditional xUnit style of TDD. In doing so, QUnit succeeds in simplifying some of the tedium of writing tests by leveraging the language features of JavaScript as opposed to strictly adhering to the more traditional xUnit conventions, the design of which is based on an fundamentally different language idiom – that is, Java.

For example, consider the follow which tests for a custom data namespace attribute in jQuery Mobile:

Figure 1 (run) (source)

The above test may appear quite straightforward, yet it serves as a good example by illustrating how each test in QUnit is implemented by the QUnit test fixture. The first argument is simply a String which describes the test case. This is quite convenient in that the intent of a particular test case can be expressed more naturally in textual form as opposed to using a long, descriptive test method name. The Second argument contains the actual test implementation itself, which is defined as an anonymous function and passed as an argument to QUnit.test.

As you may have also noticed from the above example, there are some, perhaps subtle, differences between the QUnit style of testing and the traditional xUnit style. Specifically, whereas in xUnit assertions expected values are specified first and preceded by actuals, in QUnit actuals are specified first followed by expected values. This may feel a bit odd at first however, after a few tests it’s easy to get used to. Additionally, where an assertion message is specified before any arguments in xUnit, in QUnit assertion messages are specified after all arguments. With regard to test descriptions, this is a difference I prefer as, a test message is always optional so passing this value last make sense. While somewhat subtle differences, these are worth noting.

A Complete Example

As code can typically convey much more information than any lengthy article could ever hope to achieve, I have provided a simple, yet complete, example which demonstrates a basic qUnit test implementation. (run) (source).

Multiple Form Factor Software Design

I have been giving a lot of thought lately about designing software in a Multi-Form Factor paradigm and felt I would share some initial thoughts on the subject. Keep in mind much of this is still quite new and subject to change; however, I have made an attempt to isolate what I feel will remain constant moving forward.

First, User Experience Design

My initial thoughts on the implications of what an ever growing Multi-Form Factor paradigm will have on the way we think about the design of software are primarily concerned with User Experience Design. While using CSS3 media queries to facilitate dynamic layouts will be needed for most Web Applications, I do not believe these types of solutions alone will allow for the kinds of compelling experiences users have come to expect, especially as they will likely compare Mobile Web Application experiences to their native counterparts. Sure some basic solutions will be needed, and for some simple websites they may suffice. However, in the context Web Applications, as well as just about every application developed specifically for a PC, too, I believe UX Design will need to leverage the unique opportunities presented by each particular form factor, be it a PC, smartphone, tablet or TV. Likewise, UX will need to account for the constraints of each form-factor as well. Architecturally, all of the above presents both opportunity and challenge.

To further illustrate this point, consider the fact that it is arguably quite rare that a UX Design intended for users of a PC will easily translate directly to a Mobile or Tablet User Experience. The interactions of a traditional physical keyboard and mouse do not always equate to those of soft keys, virtual keyboards and touch gesture interactions. Moreover, the navigation and transitions between different views and even certain concepts and metaphors are completely different. In simplest terms; it’s not “Apples to Apples”, as the expression goes.

With this in mind, as always, UX Design will need to remain at the forefront of Software Design.

Second, Architecture

Multi-Form Factor design obviously poses some new Architectural challenges considering the growing number of form factors which will need to be taken into account. The good news is, most existing, well designed software architectures may have been designed with this in mind to a certain degree. That is, the key factor in managing this complexity I believe will be code reuse; specifically, generalization and abstraction. A common theme amongst many of my posts, code reuse has many obvious benefits, and in the context of Multi-Form Factor concerns it will allow for different device specific applications to leverage general, well defined and well tested APIs. A good example being a well designed RESTful JSON service.

Code reuse will certainly be of tremendous value when considering the complexities encountered with Multi-Form Factor design. Such shared libraries, APIs and Services can be reused across applications which are designed for particular Form-Factors or extended to provide screen / device specific implementations.

Some Concluding Thoughts

In short, I believe both users and developers alike will be best served by providing unique User Experiences for specific Form Factors as opposed to attempting to adapt the same application across Multiple Form Factors. One of the easiest ways of managing this complexity will inevitably be code reuse.

I also believe the main point of focus should be on the medium and small form factors; i.e. Tablets and Smart phones. Not only for the more common reasons but, also because I believe PCs and Laptops will eventually be used almost exclusively for developing the applications which run on the other form factors. In fact, I can say this from my own experiences already.

While there is still much to learn in the area of Multi-Form Factor Design, I feel the ideas I’ve expressed here will remain relevant. Over the course of the coming months I plan to dedicate much of my time towards further exploration of this topic and will certainly continue to share my findings.

Web Timing Specification

The Web Timing Specification (draft) aims at providing a standard set of APIs which allow for true end-to-end instrumentation of page load times across browsers.

To quote the w3 spec: “This specification (Web Timing Specification) defines an interface for web applications to access timing information related to navigation and elements.” The API is based on the Navigation Timing and Resource Timing interfaces, respectively.

While I haven’t seen this specification mentioned as part of the HTML5 Family before, in many ways I would consider it to be a worthy candidate for membership as it provides a standards based API through which web applications can be tested for load efficiency. This is obviously something quite useful for any web application as, the ability to precisely measure page load times – and implement optimizations as needed – affords developers the opportunity to provide an improved user experience.

Historically, the ability to accurately measure page load times of web applications has been quite challenging for a number reasons. Just knowing when and where to begin is debatable and, determining the best means of doing so can be a challenge in of itself. Regardless of any current strategies being used, the result is never entirely accurate. With Web Timing developers need not be concerned with these specifics as the API provides the ability to truly measure page load times by encompassing the full scope of loading and parsing a page. This includes the time involved to request, receive and render an HTML document.

For more information, try out the examples in the current supported browsers; IE9, Chrome 6.

AS3 JSONDecoding Class

I added a simple JSON decoding class to the ActionScript 3 source code page of my blog today. This is a useful base class which you can extend to use a JSON object as a data source.

The JSONDecoder class defines a simple set of methods for loading a JSON encoded object from a specific URI, decoding the result into an ArrayCollection of ActionScript Objects, and displaying any errors that may occur.

JSON (JavaScript Object Notation) objects are a lightweight data-interchange format which are very useful due to the fact that they are language independent. JSON objects are simple objects comprised of name / value pairs which are easy to use with any language such as C, C++, C#, Java, JavaScript, ActionScript etc.

Apollo: FAQ

Adobe released the updated FAQ for Apollo last week. If you are not familiar with Apollo, it is a cross-operating system runtime being developed by Adobe. Apollo aplications can be developed using either the Flex framework, Flex Builder, Flash 9, or html and Javascript. It is a standalone runtime that dows not require a browser.

To learn more about this revolutionary runtime from Adobe read the FAQ: http://labs.adobe.com/

Flex 2 HTTP Network Monitor

In order to build and debug an RIA or web application which utilizes external data sources such as web services, xml etc, a good, quality network monitor is needed. Flex 1.5 had a built in Network Monitor that could easily be accessed in the Flex 1.5 IDE. However I have yet to find the same functionality available in Flex 2.0

At my day job I am building applications in Flex 2.0 / ActionScript 3.0 and although there are some good debugging tools available I have found that there seems to be a lack of an easy to use Network Monitor.

I have been using Charles, a great Network Debugger which is capable of displaying soap messages. xml, AMF, and various other HTTP protocols in an easy to view fashion. This type of HTTP monitoring is crucial to anyone who is building RIA’s with Flex 2.0

Check it out at http://xk72.com/charles/

FlashAJAXBridge API

I wrote an API which allows interoperability between AJAX, Flash 8 and Flex 1.5. The FlashAJAXBridge API consists of a few simple ActionScript 2.0 methods which allow you to call javascript methods that target document elements and reset their dataProviders. The API also can invoke calls to an instance of the XMLHTTPRequest object which makes discreet calls to the server for loading external xml documents.

I made a simple example that demonstrates the methods that are available for registering javascript functions which can be invoked in Flash or Flex. A cool little extra that I added is the FlashObject instance is set using attributes from an xml-config document to embed the swf. The config document also specifies which div element to write the FlashObject to.

You can view an example of the API by clicking on the link below:
FlashAJAXBridge.html

Adobe Spry – Prerelease 1

I have been building Ajax based applications for quite some time now. I definetely enjoy AJAX just as I enjoy any cool new technology. Adobe has released the Spry Framework for AJAX which is a step in the right direction. A friend of mine at work also developed an AJAX MVC which will be available on sourceforge soon. The AJAX MVC is based on a framework which is configured simular to struts MVC in Java. I’ll have a link as soon as it is available.

Below is a brief breakdown of the Spry Framework for anyone who is interested.

The Spry framework for Ajax is a JavaScript library for web designers that provides functionality that allows designers to build pages that provide a richer experience for their users. It is designed to bring Ajax to the web design community who can benefit from Ajax, but are not well served by other frameworks. The first release of the Spry framework is a preview of the data capabilities that enable designers to incorporate XML data into their HTML documents using HTML, CSS, and a minimal amount of JavaScript, without the need for refreshing the entire page. The Spry framework is HTML-centric, and easy to implement for users with basic knowledge of HTML, CSS and JavaScript. The framework was designed such that the markup is simple and the JavaScript is minimal. The Spry framework can be used by anyone who is authoring for the web in their tool of choice.

Spry

AJAX Desktop beta 1

I used to build lots of .swf’s embedded in html pages and set the html page as my desktop as oppossed to just having an image set as my desktop. This was cool because the swf would read from an xml file and add links that I can access directly from my desktop. I also had various effects and what not as well as news aggregators, clocks and an mp3 player. The only problem that I couldn’t seem to solve is that when I would try to make a selection on my desktop focus was on the .swf and not the desktop. So this was a problem.

My solution was to do the same exact thing but in AJAX rather than flash this way focus would remain on the desktop. Below is a link to the working sample as well as a link to the source files for you to use as you wish. Simply add all of your favorite images in the images folder and then modify the ajax-desktop.js file and add your images as indexes of the ‘imagesArray’. Everytime you boot up you will have a different image load randomly as your desktop. You can add links to your executables allowing you to rid yourself of desktop icons as well as links to your favorite sites.

Sample:
ajax-desktop.html

Download Source code:
ajax-desktop.zip

Cool JS and CSS View Source Firefox Extension

Every now and then I go through an extension phase where I am on a quest for the coolest Firefox extensions out there. I found about 30 new extensions that were definetely worth installing which I will post this blog once I have time to write a quick description for them all. One that is worth talking about is the “JS and CSS View source options which are added to the context menu in Firefox. This extension is pretty cool if you only want a real quick look. You can download it at http://www.scorpiondb.com/firefox/extensions/jsview/jsview1.0.7.xpi