I've been doing some pretty cool stuff at work lately and I think it's time for me to share some of the cool things that we're doing. Web development isn't anything new, I've been writing HTML since I was 12 years old, but it has changed quite a bit since I wrote my first, very simple, web pages.
My next attempt was to try Node-Jasmine-DOM. It has DOM support and Jasmine integration, so I thought I was getting close. I incorporated it in the build and got it to run in the browser, but there's an aspect to Node development that I didn't realize until it was too late. Node makes it really easy to use other Node tools as dependencies in the tool you are building. This is great for reuse, but dependencies are called that for a reason. One of the dependencies that the Node-Jasmine-DOM tool used had a defect in it and that was blocking our scripts from being tested in the build. I waited patiently for a couple of weeks after submitting the bug to the owners of the dependent tool, and there was initially some good back and forth about it for a while and someone submitted a workaround for the bug. I was excited and tried it out on my machine, but their workaround didn't work for mem (in Mac OSX), but worked in Windows. I went back to the forum and they had closed my defect, so I commented that the workaround didn't work for me and I needed another way to make it work for me. Another week of waiting without a response and I decided to pursue another way to run our tests.
For those curious about what exactly I did, read on. For those who don't want the technical details, thanks for reading this far! This next part may not be for you as it will be pretty technical.
The next step that the build does is to get the list of runner files and run them. I created an ant macro for this step. The Build-Doctor guy provided the envjs.bootstrap.js file that I started with, but later customized. His was very simple and was basically just a for loop that told Envjs to load a page. I found that that wouldn't work for more than one runner, so I changed it a bit to reload Envjs at the beginning of the loop and then load the runner file. I also added some console.log entries so that the build is more vocal about what it's doing.
Here's where I got a little bold and changed the Jasmine.js and Env.js files to eliminate some extra console.log calls that I didn't feel were required and I added some in a couple of places where I wanted visibility. In the end, it looks great in the build and it creates JUnit style reports that our Jenkins CI server can interpret.
I was planning on covering the other major aspect of our build, Freemarker, but this post is getting pretty long, so I'll save that for another day. Below are some examples of what I did in our build.
This is the macro I wrote in our ant build.
This is the results of running a spec in our build as seen in the terminal.
[exec] Launching runner: /trunk/bin/debug/_slider/_sliderTest.runner.html [exec] [exec] Runner Started. [exec] _slider : should have 100 hundred items after the method addItem is called 100 times ... [exec] Passed. [exec] _slider : should have 99 items after the method removeItem is called ... [exec] Passed. [exec] _slider : should have zero items after the method removeAllItems is called ... [exec] Passed. [exec] _slider : should show slider when content extends past the width of the slider ... [exec] ***FAILED*** [exec] _slider : should hide slider when content does not extend past the width of the slider ... [exec] Passed. [exec] _slider : should remove padding from the left side of the viewport ... [exec] Passed. [exec] _slider : should add the class bby-slider-item-first to the first item in the slider ... [exec] Passed. [exec] _slider : should recieve the second item out of five and the HTML should match ... [exec] Passed. [exec] _slider: 7 of 8 passed. [exec] Runner Finished. [exec] [exec] Done with runner: /trunk/bin/debug/_slider/_sliderTest.runner.html
This is one of our runner files. The highlighted parts are what the build inserts into the file.