Visual Studio and .NET's Unit Test Framework

Abstract

Microsoft Visual Studio and .NET have their own UnitTest framework that is separate from NUnit and other Automation Testing Frameworks.

First of all, let's understand what a Framework is. Framework is an Architectural term and it means "Collection of Components".

Defining SUT (system under test)

Let's say I have developed some business logic for my application which performs some mathematical calculation based on user input and is available via a MathLibrary.dll. Hence, it is very critical to have the business logic well tested on various parameters that the user might pass. So my business logic is "System Under Test " from a Unit Test perspective. The source code of this MathLibrary business logic component is as shown below.

using System;  
namespace MathLibrary  
{  
       public class MathClass  
       {  
               public int Sum(int n1, int n2)  
               {  
                     if(n1<=0 && n2<=0)  
                     {  
                          throw new ArgumentException("No Zero or Negative are allowed");  
                      }  
                      else  
                      {  
                            return n1 + n2;  
                      }  
               }  
         }  
 }  

Since it's a DLL component, test coverage of this is very critical for ensuring that the business logic is intact and returns the correct results.

To do so, instead of relying on a Manual Test Process through a UI that will be very cumbersome and tedious to continuously test the sanity of the business logic, we can choose to Automate this test process.

As you might have noticed, we have written the Sum function (in MathLibrary.dll) in a Test Driven, style. In other words, the parameters passed are also being validated for all the possible test scenarios.

  1. If the argument is positive and non-zero then the sum of the arguments passed is returned.
  2. If the argument passed is 0 ("zero") then an exception is thrown
  3. If the argument passed is negative then an exception is thrown

How to approach Test Automation in general?

Irrespective of what Unit Test tool and development techniques you use, the test process depends on the following two things.

  1. Expected: Before we perform a test our Test case tells us what to expect by this test case to verify success; for example in the case of a Sum taking two ints, we expect it to return the exact results of adding two numbers.
  2. Actual: When you perform the test what your result is.

If Expected meets the Actual then your Test Case has Passed, otherwise, your Test Case has Failed.

Hence we have to do Test Coverage for all the Test Cases in the test scenarios described previously.

To do so, we will use Microsoft Visual Studio 2008 or 2010 and then open a New Test Project as shown in the following image.

Image 1.jpg

Now after this project has loaded, it will have a file UnitTest1.cs in it, this is the file you will be automating; we have created all the Test Cases for the MathLibrary.dll (our business logic).

To Automate the Test Cases in Microsoft Visual Studio using the Unit Testing Framework, you need to understand a few more things.

  1. Test Automation Framework: Microsoft has its Unit Testing Framework implemented in a namespace which is Microsoft.VisualStudio.TestTools.UnitTesting
  2. [TestMethod] attribute: This is the attribute that needs to be present on each method that will represent a TestCase.
  3. Assert class: This class is part of Microsoft's Unit Testing framework, and we can use this class to verify that our Actual and Expected are the same or not, etc.

As mentioned above for every Test Case we have to write Automation code.

Note. Before we start coding the Automated TestCases,don't forget to add all the References.

WebReferences etc. that your Test infrastructure will use.

I have covered Four Test Cases for the Sum Function in MathLibrary.dll

// Test Case #1: to verify if passed ints are returning Right Result
[TestMethod]
public void TestSumResultAreEqual()
{
    MathLibrary.MathClass objMath = new MathClass();
    Assert.AreEqual(24, objMath.Sum(12, 12));
}
// Test Case #2: to verify if passed ints are Not returning Right Result
[TestMethod]
public void TestSumResultAreNotEqual()
{
    MathLibrary.MathClass objMath = new MathClass();
    Assert.AreNotEqual(25, objMath.Sum(12, 12));
}
// Test Case #3: to verify if passed ints are actually Zero
[TestMethod]
public void TestSumThrowExceptionWhenZero()
{
    MathLibrary.MathClass objMath = new MathClass();
    try
    {
        objMath.Sum(0, 0);
    }
    catch (ArgumentException)
    {
        // logging code will go here
    }
}
// Test Case #4: to verify if passed ints are actually Negative
[TestMethod]
public void TestSumThrowExceptionWhenNegative()
{
    MathLibrary.MathClass objMath = new MathClass();
    try
    {
        objMath.Sum(-123, -456);
    }
    catch (ArgumentException)
    {
        // logging code will go here
    }
}

Once you have coded all the Test Cases to Test the functionality, it's time to build the code and a TestProjectName.dll will be produced.

There are two ways to Test your automation code now.

  1. Using the Visual Studio IDE: Build and then Run the project within Visual Studio; you will see all the TestMethods being executed and the Test Results are shown, as shown in the following image.
    Image 2.jpg
  2. Using Visual Studio's command prompt: Open Visual Studio's command prompt and navigate to the folder where the TestProjectName.dll is located and then run this command.
    mstest /testcontainer:TestProjectName.dll
    
    Image 3.jpg

Summary

This article explained the approach to Test Automation using Microsoft Visual Studio's Unit Testing Framework. Some basic fundamentals about the framework, what is expected out of a test, and how to automate a business logic in a DLL form. The same approach can be used to even automate a WebService component etc.