Abstract
Microsoft Visual Studio and .NET has its 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, its is very critical to have the business logic well tested on various parameters which user might pass. So my business logic is "System Under Test " from 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:
- If the argument is positive and non-zero then the sum of the arguments passed is returned.
- If the argument passed is 0 ("zero") then an exception is thrown
- 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 technology you use, the test process depends on the following two things:
- Expected: Before we really 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.
- 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:
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).
In order to Automate the Test Cases in Microsoft Visual Studio using the Unit Testing Framework, you need to understand a few more things:
- Test Automation Framework: Microsoft has its Unit Testing Framework implemented in a namespace which is Microsoft.VisualStudio.TestTools.UnitTesting
- [TestMethod] attribute: This is the attribute that needs to be present on each method that will actually represent a TestCase.
- 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 each and 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
-
- [TestMethod]
- public void TestSumResultAreEqual()
- {
- MathLibrary.MathClass objMath = new MathClass();
-
- Assert.AreEqual(24, objMath.Sum(12, 12));
- }
-
- [TestMethod]
- public void TestSumResultAreNotEqual()
- {
- MathLibrary.MathClass objMath = new MathClass();
-
- Assert.AreNotEqual(25, objMath.Sum(12, 12));
- }
-
- [TestMethod]
- public void TestSumThrowExceptionWhenZero()
- {
- MathLibrary.MathClass objMath = new MathClass();
-
- try
- {
- objMath.Sum(0, 0);
- }
- catch (ArgumentException)
- {
-
- }
- }
-
- [TestMethod]
- public void TestSumThrowExceptionWhenNegative()
- {
- MathLibrary.MathClass objMath = new MathClass();
-
- try
- {
- objMath.Sum(-123, -456);
- }
- catch (ArgumentException)
- {
-
- }
- }
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:
- 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:
- 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
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.