February 2010 - Posts
You usually write unit test and integration test code separately using different technologies. For example, for unit test, you use some mocking framework like Moq to do the mocking. For integration test, you do not use any mocking, just some test classes that hits some service or facade to do end-to-end integration test. However, sometimes you see that the integration and unit test are more or less same, they test the same class using its interface and perform the same tests against the same expectation. For example, if you think about a WCF service, you write unit test to test the ServiceContract using the interface where you use some mocking framework to mock the interface of the WCF Service. If you look at the following example, I am using Moq to test IPortalService interface which is a ServiceContract for a WCF service. I am using xUnit and SubSpec to do BDD style tests.
[Specification]
public void GetAllWidgetDefinitions_should_return_all_widget_in_widget_gallery()
{
var portalServiceMock = new Mock<IPortalService>();
var portalService = portalServiceMock.Object;
"Given a already populated widget gallery".Context(() =>
{
portalServiceMock.Setup(p => p.GetAllWidgetDefinitions())
.Returns(new Widget[] { new Widget { ID = 1 }, new Widget { ID = 2 }})
.Verifiable();
});
Widget[] widgets = default(Widget[]);
"When a widget is added to one of the page".Do(() =>
{
widgets = portalService.GetAllWidgetDefinitions();
});
"It should create the widget on the first row and first
column on the same page".Assert(() =>
{
portalServiceMock.VerifyAll();
Assert.NotEqual(0, widgets.Length);
Assert.NotEqual(0, widgets[0].ID);
});
}
Now when I want to do an end-to-end test to see if the service really works by connecting all the wires, then I write a test like this:
[Specification]
public void GetAllWidgetDefinitions_should_return_all_widget_in_widget_gallery()
{
var portalService = new ManageCustomerPortalClient();
"Given a already populated widget gallery".Context(() =>
{
});
Widget[] widgets = default(Widget[]);
"When a widget is added to one of the page".Do(() =>
{
widgets = portalService.GetAllWidgetDefinitions();
});
"It should create the widget on the first row and
first column on the same page".Assert(() =>
{
Assert.NotEqual(0, widgets.Length);
Assert.NotEqual(0, widgets[0].ID);
});
}
If you look at the difference, it’s very little. The mockings are gone. The same operation is called using the same parameters. The same Asserts are done to test against the same expectation. It’s an awful duplication of code.
Conditional compilation saves the day. You could write the unit test using some conditional compilation directive so that in real environment, those mockings are gone and the real stuff gets run. For example, the following code does both unit test and integration test for me. All I do is turn on/off some conditional compilation.
[Specification]
public void GetAllWidgetDefinitions_should_return_all_widget_in_widget_gallery()
{
#if MOCK
var portalServiceMock = new Mock<IPortalService>();
var portalService = portalServiceMock.Object;
#else
var portalService = new ManageCustomerPortalClient();
#endif
"Given a already populated widget gallery".Context(() =>
{
#if MOCK
portalServiceMock.Setup(p => p.GetAllWidgetDefinitions())
.Returns(new Widget[] { new Widget { ID = 1 }, new Widget { ID = 2 }})
.Verifiable();
#endif
});
Widget[] widgets = default(Widget[]);
"When a widget is added to one of the page".Do(() =>
{
widgets = portalService.GetAllWidgetDefinitions();
});
"It should create the widget on the first row and
first column on the same page".Assert(() =>
{
#if MOCK
portalServiceMock.VerifyAll();
#endif
Assert.NotEqual(0, widgets.Length);
Assert.NotEqual(0, widgets[0].ID);
});
}
The code is now in unit test mode. When I run this, it performs unit test using Moq. When I want to switch to integration test mode, all I do is take out the “MOCK” word from Project Properties->Build->Conditional Compilation.
Hope this gives you ideas to save unit test and integration test coding time.
If your computer is running hot or battery running out quickly then it is most likely due to some application or process consuming high CPU or memory. If you keep running applications for a long time, for example, Outlook, then it continues to grow in memory consumption and does not free up memory efficiently. As a result, your computer runs out of physical memory and other applications run slower. Sometimes Outlook, browser, image editing applications or some other application start taking full CPU as they get into some heavy internal processing and make your CPU hot and other applications perform slower.
My new CPUAlert is an application that monitors CPU and memory consumption of applications and alerts you if some application is consistently taking high CPU or high memory. It not only saves your CPU and Battery’s lifetime but also makes your computer run smooth and let your active applications run as fast as they can be.
While it is running, if some process is consuming more than 200 MB memory, it will show you an alert:
Here you can see my Outlook is taking 244 MB of physical RAM.
You can either postpone the alert for 5 mins (just press ESC), or ignore the process permanently so that you no longer receive alert for the process anymore, or you can close it and reclaim memory.
The handy feature is “Restart” which closes the application and starts again. This generally frees up memory that clogs up in the process.
Same alert will come if some process is consuming more than 30% CPU for over 5 mins.
You can configure all these settings like what’s the tolerable limit for CPU and memory, how frequently to show alert, how long to wait before closing application etc by right clicking on the Task bar icon and choosing Settings.
Source code of the project is available at:
http://code.google.com/p/cpualert/
The installer can also be downloaded from there.
Warning: The code is not in a good shape. I was frustrated at some process taking high CPU and memory and I wrote this app within hours to get the job done for me.
If you like the application, spread the word!
I have enhanced my streaming Ajax Proxy with POST, PUT and DELETE features. Previously it supported only GET. Now it supports all 4 popular methods for complete REST support. Using this proxy, you can call REST API on external domain directly from your website’s javascript code. You can test the proxy from this link:
labs.omaralzabir.com/ajaxstreamingproxy/GetPutDeleteTest.aspx
The latest source code for the Ajax Proxy is available here:
http://code.google.com/p/fastajaxproxy/
You can find a detail CodeProject article that explains how the streaming asynchronous aspect of this proxy works:
Fast, Scalable, Streaming AJAX Proxy - continuously deliver data from across domains
Here’s how the test UI looks like where you can test POST, PUT and DELETE:
If you want to run the sample source code on your local IIS, make sure you allow the POST, PUT, and DELETE headers on .ashx extension from IIS properties:

The sample project shows how you can use the proxy to make calls to external domains. You can directly hit any external URL and perform POST or DELETE from your javascript code:
var proxyUrl = "StreamingProxy.ashx";
function download(method, proxyUrl, contentUrl, isJson, bodyContent, completeCallback) {
var request = new Sys.Net.WebRequest();
if (method == "POST" || method == "PUT")
request.set_httpVerb("POST");
else
request.set_httpVerb("GET");
var url = proxyUrl + "?m=" + method +
(isJson ? "&t=" + escape("application/json") : "") + "&u=" + escape(contentUrl);
request.set_url(url);
if (bodyContent.length > 0) {
request.set_body(bodyContent);
request.get_headers()["Content-Length"] = bodyContent.length;
}
var startTime = new Date().getTime();
request.add_completed(function(executor) {
if (executor.get_responseAvailable()) {
var content = executor.get_responseData();
var endTime = new Date().getTime();
var statistics =
"Duration: " + (endTime - startTime) + "ms" + '\n' +
"Length: " + content.length + " bytes" + '\n' +
"Status Code: " + executor.get_statusCode() + " " + '\n' +
"Status: [" + executor.get_statusText() + "]" + '\n';
appendStat(statistics);
$get('resultContent').value = content;
completeCallback();
}
});
var executor = new Sys.Net.XMLHttpExecutor();
request.set_executor(executor);
executor.executeRequest();
}
I am using MS AJAX here. You can use jQuery to perform the same test as well. All you need to do is hit the URL of the StreamingProxy.ashx and pass the actual URL in query string parameter “u” and pass the type of the http method in query string parameter “m”. That’s it!
I am a 64bit freak. I got Windows 7, Outlook 2010, Conferencing Addin all 64 bit versions to work on a Macbook pro. Those who are thinking about moving to 64bit and hesitating whether something will break, GO AHEAD! Macbook Pro hardware and Microsoft’s software are the best combination out there. You will enjoy every moment you spend with your laptop. Moreover, I have tried these combinations on HP tablet PC, Sony VAIO, Dell Inspiron and Dell Vostro. HP works best. Others are struggling with driver issues.
I will give you positive and negative feedback with the apps I have tried so far:
Outlook 2010 64 bit:
Here are my negative feedback. Outlook Product Manager, please read this. I am a hardcore Outlook customer of you.
- All my Outlook COM addins are dead. Outlook 2010 64bit does not support them. Looks like not so good backward compatibility.
- Not so significant improvement with Exchange 2007. The startup time has improved from about 5 secs to 2 secs. But the startup time saving is not really a big saver since I start outlook and it keeps running for days until my PC is so screwed that I need a restart.
- Office Communicator 2005 does not work.
- The beta Office 2010 applications are CPU hungry. I see 30% to 40% CPU most of the time.
- It took me over 30 hours until Outlook 2010 started to perform well. All this time, it was indexing and indexing and indexing and burning CPU.
- There’s nothing so ground breaking and productivity enhancing in Outlook 2010 yet. After upgrading and using it for couple of days, I don’t see something so attractive that justifies the time spent in upgrading for busy professional. It’s not upgrade at this stage so far. You have to uninstall all Office 2007 or earlier products, addins etc and then install Outlook 2010.
- Outlook Keyboard shortcuts are changed, having hard time adjusting. My precious Alt+L for Reply to All is gone. Now it’s Ctrl+Shift+R. Come on guys, when do you just Reply and not to Reply to All? I barely remember ever using Reply only. It’s always Reply to All. Can’t you make a easier shortcut for this?
- Keyboard focus gets lost to some weird place sometimes and my navigation using cursor gets broken. I have to click using mouse to get into track.
- Quick Tasks are kind of limited. For ex, “Reply & Delete”, who would want to press CTRL+SHIFT+1 to do reply and delete? It’s more natural to press Ctrl+R to reply and then send it and hit DEL. The choices on Quick Tasks are limited as well. I was hoping I would be able to chain multiple commands like – open a new message window, select a specific account to send mail using, select a specific signature and after the mail is sent, show move dialog box to move the conversation to a specific folder. Nope, it does not work this way. First of all there are limited commands which does not even support this. Secondly, all the actions are performed instantly one after another without waiting for the first action to complete.
- Quick Steps cannot be added to Quick Access Toolbar. Go figure!
Now the good things:
- Overall Outlook experience is smooth. Opening new mail, typing address, doing search, moving messages, viewing a folder on conversation view mode are all significantly faster, even with Exchange. It’s hard to say if it’s due to fully 64 bit environment or due to the fact that none of my COM addins are working.
- Outlook exits. Finally! None of the previous Outlook would terminate the process if I exited Outlook. It remains in memory forever unless I kill it from task manager. Now the Outlook really closes, or at least kills itself when I exit. Whenever I exit Outlook and start again, I see it doing some Data Integrity check. This means it is not really closing itself properly, but killing itself. I assume that’s bad and my data in Outlook are slowly getting messed up.
- The conversation view is great!
- Inline appointment viewer is a life saver. When I get an appointment invite, the email preview shows a small view of the calendar around the meeting time. I can see if I am occupied or if there’s an available time before or after the meeting. This saves me a lot of time everyday as rescheduling meeting is a tedious job in my company and it takes around 4 to 7 reschedules attempts to get a suitable time slot in everyone's diary for every darn meeting.
- Quick Steps is more or less useful. I am getting used to using CTRL+SHIFT+1 to “reply to all and delete” and CTRL+SHIFT+2 for “reply to all and move to folder”. You just have to configure the quick steps to make it suit you. Previously I used to use QuickFile addin, which was a super useful tool, worth paying $39.95.
Onenote 2010 64 bit
The UI is certainly much slicker. It really looks and feels like a notebook now. Sketching performance is improved.
However, a big bug. I was sketching and suddenly my pointer switched to selection mode from pen. All pen options are disabled. I tried exiting and coming back. Nope. Can’t go back to pen mode at all. I am using a Genius Tablet. Looks like Onenote is Tablet PC friendly only. Hope Apple makes a Tablet Macbook Pro soon.
Word 2010 64 bit
Haven’t used it much. Ribbons are as confusing as before. The File menu is even more confusing now. No new shape styles that makes word documents stand out from the rest. No new Smart Art worth mentioning. Overall – disappointing.
The print features are much improved!
Powerpoint 2010 64 bit
I did not notice any significant new feature in Powerpoint, sadly. The ribbon has been made more useful than before. There’s a “Transition” and “Animations” ribbon bar which is very useful to use and saves time putting animations in slides. But that’s all I could see from my limited trial. This is disappointing. I was expecting there would be richer collection of shapes which are really cool to look and makes presentations look like Web 2.0 sites, a lot of new Smart Arts, but nothing.
Visio 2010 64 bit
The UML Diagram designer is as crappy as ever. Come on Microsoft, watch the other UML designers and learn from them. Currently Visio is my last choice for UML design and makes my job life unhappy because my company forces me to use it. I use PlantUML wherever I can.
I don’t see any new amazingly cool diagram either. I was hoping the Detailed Network Diagram stencil would be much improved with smooth round glossy servers, amazingly cool looking router icons etc. But no luck. The new ribbon interface is as confusing as other Office applications.
Conclusion
So far I can see significant improvement in Outlook only. Other apps do not have anything that stands out.
More Posts