Monday, November 26, 2012

VS 2010 Test Controller / SQL Server 2012 - Could not find stored procedure 'sp_dboption'

While configuring VS 2010 Test Controller with SQL Server 2012 as Load Test Repository, I was getting an error:

Microsoft.VisualStudio.TestTools.ConfigCore.TestControllerHelper.CreateAndUpgradeLoadTestSchemaIfRequired(String loadTestConnectionString, String directoryContainingSchemaFile)
E, 2012/11/26, 09:35:41.787, Microsoft.VisualStudio.TestTools.WebStress.LoadTestException: An error occurred while attempting to create the load test results repository schema: Could not find stored procedure 'sp_dboption'.
Could not find stored procedure 'sp_dboption'.


Found the same issue when I tried to create the Load Test Repository manually by executing the script C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\loadtestresultsrepository.sql

Then I looked for the corresponding VS 2012 script on a different machine at C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\loadtestresultsrepository.sql which worked.

Looking at the difference, the fix was to replace exec sp_dboption with ALTER DATABASE

Example:

Replace exec sp_dboption N'LoadTest2010', N'autoclose', N'false' with ALTER DATABASE [LoadTest2010] SET AUTO_CLOSE OFF

Tuesday, November 6, 2012

Selenium - Automating UI Testing for Websites using Visual Studio Unit Tests


Selenium is a well-known open source tool for UI automation of websites across a range of browsers. To know more, please refer http://seleniumhq.org/
A huge benefit of using Selenium is that you don’t need an interactive desktop session to run the automated UI tests.
Here we will discuss about integrating Selenium with Visual Studio Unit Tests written in C#
Test
·         Open Bing http://www.bing.com

·         Search for James Bond

·         Verify the results contain a Wikipedia link for James Bond
Steps
·         Download the IE Driver (needed only for running tests in IE) and the C# Client Drivers from http://seleniumhq.org/download/

·         Create a Unit Test Project in Visual Studio using File-New-Project->Test->Test Project

·         Add a folder called Dependencies and add the following files with Copy Always to Output:

o   WebDriver.dll

o   IEDriverServer.exe

o   Ionic.Zip.dll

o   Newtonsoft.Json.dll

·         Add a Reference to WebDriver.dll

·         Make sure Enable Deployment is checked in the Test Settings File, see http://msdn.microsoft.com/en-us/library/ms182475(v=vs.90).aspx

·         Import the following namespaces

using Microsoft.VisualStudio.TestTools.UnitTesting;

using OpenQA.Selenium;

using OpenQA.Selenium.IE;

using System.Drawing.Imaging;

·         Create a Test Class with DeploymentItem Attribute   
[TestClass]
[DeploymentItem("Dependencies\\IEDriverServer.exe")]
public class IETests

·         Create a web driver in Class Initialize and Quit in Class Cleanup
private static InternetExplorerDriver _webDriver;       

[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext)
{
            _webDriver = new InternetExplorerDriver(new InternetExplorerOptions() {IntroduceInstabilityByIgnoringProtectedModeSettings = true});

       }
 
[ClassCleanup()]
public static void MyClassCleanup()
       {
            _webDriver.Quit();
       }
 
       private TestContext testContextInstance;    

       public TestContext TestContext
       {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
       } 

·         Create a Test Method
[TestMethod]
       public void TestBing()
       {
            // Test Case Steps
            _webDriver.Navigate().GoToUrl("http://www.bing.com");

            IWebElement search = _webDriver.FindElement(By.Name("q"));

            IWebElement go = _webDriver.FindElement(By.Name("go")); 

            search.SendKeys("james bond");

            go.Click(); 

            // Save screenshot if required
            Screenshot screenshot = _webDriver.GetScreenshot();

            screenshot.SaveAsFile("Result.png", ImageFormat.Png); 

            // Verfication
            IWebElement msWebsite =
                _webDriver.FindElement(
                    By.XPath(

                        "//a[@href='http://en.wikipedia.org/wiki/James_Bond']")); 

            Assert.IsNotNull(msWebsite, "Could not find wikipedia link for James Bond");
       } 

·         To test with Firefox, we can similarly create a Firefox web driver

private static FirefoxDriver _webDriver;

 Troubleshooting
If you see the error Class Initialization method Selenium.IETests.MyClassInitialize threw exception. System.InvalidOperationException: System.InvalidOperationException: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones. (NoSuchDriver).

This could be if you instantiated the IE Driver using new InternetExplorerDriver()
The fix is to either use new InternetExplorerDriver(new InternetExplorerOptions() IntroduceInstabilityByIgnoringProtectedModeSettings = true})

Or enable Protected Mode setting for all zones. Go to Tools->Internet Option->Security and check “Enable Protected Mode” for all zones.

Friday, November 2, 2012

Windows Azure: Automated UI testing using the power of cloud

Problem Statement
Automated UI testing needs to be performed from different parts of the world.
The tests can validate various UI behaviors from different geo locations e.g. behavior of JavaScript which makes service calls.
Background
As we have seen in my previous post on Performance testing using the power of cloud, it is possible to install test agents around the globe and run Load Tests from the agents. The same setup can be used to run unit tests or web tests by distributing them across different agents.
Challenge
The challenging part is to run UI tests (e.g. Coded UI) from the agents in cloud. This is because we will always need to have an active desktop session for the tests to interact with the UI. One option would be to have dedicated hardware on premise from where active remote desktop session is always maintained for all the agents in the cloud. The other option is to tweak the configuration a little as described below without requiring any additional hardware.
Solution
Perform the same steps which were done for the setting up the environment to run load tests i.e. Installing Test Controller on Premise and Setting up Windows Azure Connect.
Now below are the changes that the needed to specifically run Automated UI Tests
  • Instead of having just one user on the Azure VM’s, we will need to have two users. One of them is used for Remote Desktop and the other one is used to Run Tests.
  • The Remote Desktop user needs to be specified in the configuration file (.cscfg)
<Setting name="Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountUsername" value="remoteuser" />
  •  The Test Agent user needs to be created in setup.cmd (This user name and password should be the same as the one configured on Test Controller)
REM Create user vstestagent as an administrator
net user vstestagent <<password>> /expires:never /add
net localgroup administrators vstestagent /Add

  •  Deploy the worker role and add it to the Local Endpoint Group for Windows Azure Connect as before.
  • Now Remote Desktop to the Azure VM from the Azure Portal using the Remote Desktop user.
  • Once connected, get the machine name of the VM from Computer->Properties.
  • Go to Run and type mstsc and connect to the same VM using the machine name. While connecting this time, type the credentials of the Test Agent user.
  • Configure the test agent with the test controller in Interactive mode.
  • Finally, a script needs to be run to turn off IE ESC, set default IE settings, turn off Phishing filter and disable Auto Lock. A command file can be added which does the following:
  • REM Configure IE ESC to Off
    REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" /v "IsInstalled" /t REG_DWORD /d 0 /f
    REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" /v "IsInstalled" /t REG_DWORD /d 0 /f
    Rundll32 iesetup.dll, IEHardenLMSettings
    Rundll32 iesetup.dll, IEHardenUser
    Rundll32 iesetup.dll, IEHardenAdmin
    REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" /f /va
    REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" /f /va
    REM Set Default IE Settings
    REG DELETE "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "First Home Page" /f
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Default_Page_URL" /t REG_SZ /d "about:blank" /f
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Start Page" /t REG_SZ /d "about:blank" /f
    REM Disable Phishing Filter
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\PhishingFilter" /v "ShownVerifyBalloon" /t REG_DWORD /d 3 /f
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\PhishingFilter" /v "Enabled" /t REG_DWORD /d 0 /f
    REM Disable Auto Lock
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v "DisableLockWorkstation" /t REG_DWORD /d 1 /f
    • Now don’t minimize any remote desktop windows and simply close the remote desktop window of the Remote Desktop user. This way the Remote Desktop window of the Test Agent user will be always active and the UI Tests can interact with the desktop.
    Result
    Now you can run your tests using the Test Controller. The Agent running as an interactive Process should be shown with an asterisk (*)
    The Automated UI Test runs on the Test Agent
    To confirm that the desktop doesn’t get locked, wait for 10-15 minutes, rerun the automated UI test and verify that it passes.