If you want people to test your beta software you need to make it as easy as possible to obtain and test. WebKit makes testing their nightly builds an absolute snap.

All you need to do is to download the build and then run the exe. That’s it. Webkit exists as a dynamic library so the application opens up your existing safari and loads the new browser engine inside.

This allows your existing “released” Safari to sit side by side with the nightly build. To add icing to the cake, the icon is a gold colour instead of silver, so you can easily tell which one you are running.

You have to check this out Wario Land You tube ad.

I have to agree with the Linux hater on this one. Why would anyone want to spend time getting Cossover Chromium to run in WINE instead of just spending that same 11 days contribute to the native version is beyond me.

Google Chrome’s user experience

Does the phrase the ugly step sister mean anything to anyone?

As it turns out the mock-ups in the comic of Google Chrome were pretty spot on. It looks and feels like a bad, thrown together XP application, complete with an blue XP title bar. Come on guys, windows has OS themes for a reason. Use them.

The tabs are not spatially efficient either and take up too much room horizontally in the window. Guys have a look at Firefox 3, Safari or Internet Explorer 8 and take notes.

Google Chrome’s Performance

Normally to test some thing like this I would want to perform proper testing. Well I am not going to bother as it uses Webkit, and webkit screams. Also I am using a virtual environment so this wouldn’t be a fair test not would it.

Google Chrome’s Features

So far the features seem to be there, but not changing my work habits. I think building the search into the main text box is pretty cool and a lot simpler. Look for this on other browsers soon.

Overall

The jury out is on this one. I’ll need to wait and see the Mac OS X version before I stop using IE and Safari as my default browsers on their respective operating systems

Another chapter in the browser war is about to erupt with the launch tomorrow of Google Chrome.

Google doesn’t mind going head to head with Microsoft, and in a surprising move it is launching its own webkit based browser which launches in beta form on Windows tomorrow.

With the majority of internet users using its search engine, it is not beyond the realm of possibility that this browser could gain a large chunk of market share very quickly. The only real question is will it be at the expense of Internet Explorer or the other smaller share browsers such as Firefox and Safari.

One of the big architectural changes will be to run the browser in multiple processes in stead of a single process and thread. This approach is designed to eliminate single thread blocking issues and also allow the browser to have each “tab” run in its own protected memory space so that one crashing tab won’t crash the entire browser.

This whole project seems to have emerged from the gears team, so you can pretty much ensure that it will support on-line and off-line browsing by default for sites that support gears.

Oh and did I mention that they build a jitted, managed javascript runtime that follows the Java / .Net architecture.

What is “Skymarket”, well according to a Computerworld blog post for the Skymarket Senior Product Manager:

“… the Windows Mobile marketplace “the place to be” for developers wishing to distribute and monetize their Windows Mobile application”

Why didn’t Microsoft just copy Installer.app before Apple copied it, then they could have beaten them to the punch instead of chasing tail lights once again.

Twelve moths ago, before my last project started I went on a journey. The intended destination was test automation nirvana. The way to get there, or so I thought was to combine WatiN with The Braidy Tester’s Automation Stack. The end result, I hoped would be the Deep Thought of test automation. It didn’t quite work out that way, and I would like to share some o the challenges we faced.

The Braidy Tester’s automation stack

I am not going to describe the architecture in detail of the Braidy Tester’s automation stack, as Michael Hunter has already covered that in great detail. What IS important however is the pieces that we chose. The key aspects of the stack that we decided implement were:

  • Logical Functional Model The logical functional model is a user centric view of how the application is used. For example: Logical.Google.Search("Bruce McLeod");
  • Physical Object Model The physical object model is an abstraction layer that hides the implementation and automation semantics details from the tests. For Example:Physical.Google.btnSearch.Invoke();
  • Execution Behaviour Manager Execution behaviours are a way of loosely coupling execution actions. They allow executions to be composed, as well as executed in different sequences.
  • Loosely Coupled Verification Instead of littering your tests with assert statements, loosely coupled verification takes a snapshot of the application, calculates an expected state based on your execution behaviour and then compares it to the actual state after the action is performed.
  • Test Data Providers Test Data providers remove the need for test data to be hard coded into the test by moving it out, into a database in our case.

Things that worked brilliantly in the automation stack

The separation into the logical and physical layers worked exceptionally well. The test cases become very clean and concise. We added another lower level layer called the controller in place of the Application Internals model.

The controller essentially was an abstraction later over WatiN and our control definitions. This makes the entire stack easily portable from one automation technology to another, so the transition will be very easy when the new automation tools ship in the next version of Visual Studio Team Test, if we decide to change.

Implementing Execution Behaviours with Delegates

The idea behind Execution Behaviours is that you use attributes on a method that matches the delegate signature to perform one of the following actions:

  • Execute all the specified actions in the listed sequence. ExecuteInSequence
  • Execute one of the actions "randomly". ChooseAny
  • Execute all the actions in the listed sequence until some condition is met. ExecuteUntil

Execute in sequence is straight forward and is used to compose actions.

[CompositeExecutionBehavior("OpenSearchPage", "WebSearch")]

public static void Search(TestDataProvider dataProvider)

{

   TestActionDelegate myDelegate = TestExecutionManager.ExecuteInSequence(Logical.Google. Search(TestDataProvider dataProvider);

}

With delegates being used and the possibility of execution sequence order changing, it becomes necessary to provide inherit record and replay for actions. We chose to use a version of the command pattern and use .net serialization to achieve this. We also had to package up the parameters into an array of objects to the could be serialized. The implementaiton of one of our actions in the physical layer would look something like this:

public static void OpenSearchPage(TestDataProvider dataProvider)

{

   // Add this action to the command list and serialize it

   object[] parameters = { dataProvider };

   ExecutionManager.Add(parameters);

   // Open the search page

   SearchModel searcher = new SearchModel();

   searcher.OpenSearchPage(dataProvider);

}

This then calls the physical layer that actually does the work. All this loosely coupled goodness is great, except that we only ever used the one type of execution behaviour, execute in sequence. As a result our code could have actually looked like this instead if it was hard coded in the logical model.

public static void Search(TestDataProvider dataProvider)

{

   SearchModel searcher = new SearchModel();

   searcher.OpenSearchPage();

   searcher.Search(dataProvider);

}

That code is much simpler and easier to maintain, and removes the method signature matching constraints that delegates impose. For us it would have been a much better way to go, simply because we would have removed the constraints required by functionality that we didn’t actually implement.

In the next post, I’ll run through some of the benefits and challenges we had implementing loosely coupled verification.