vendredi 12 août 2016

What is the best practice for handling Try Catch when writing automated testing?

I'm currently writing test automation for a web based application for my company. I am utilising C#, Visual Studio test suite, and Selenium to perform testing.

Today I asked the question to my colleague of 'Is there any time where there is too many Try Catch blocks in code?'. His reply was to not work as I am at the minute (see example 1), but to just get the lower level try-catch to throw to the upper level try-catch so that the exception can be written there and the test failed (see example 2).

Example 1:

TestCase.cs

[TestMethod]
Public Void TestLogin()
{
    Assert.IsTrue(FW_Shared.Perform_Login(FW_Shared.OrgCode, FW_Shared.Username, FW_Shared.Password));
    Console.WriteLine(@"Login Successful");    
}

FW_Shared.cs

Public Static Class FW_Shared
{
    public static string OrgCode = "Test123";
    public static string Username = "Tester";
    public static string Password = "Password";

    public static void Perform_Login(string OrgCode, string Username, string Password)
    {
        Try
        {
            Driver.Url = "http://test.app.com/";
            Driver.FindElement(By.Id("org_code")).SendKeys(OrgCode);
            Driver.FindElement(By.Id("username")).SendKeys(Username);
            Driver.FindElement(By.Id("password")).SendKeys(Password);
            Driver.FindElemenet(By.Id("btnsubmit)).Click();
        }
        Catch (Exception ex)
        {
             Console.WriteLine(@"Error occurred logging on: " + ex.ToString());
             return false;
        }
        return true;
    }
}

Example 2

TestCase.cs

[TestMethod]
Public Void TestLogin()
{
    Try
    {
        Assert.IsTrue(FW_Shared.Perform_Login(FW_Shared.OrgCode, FW_Shared.Username, FW_Shared.Password));
        Console.WriteLine(@"Login Successful");  
    }
    Catch (Exception ex)
    {
        Console.WriteLine(@"Exception caught, test failed: " + ex.ToString());
        Assert.Fail();
    }  
}

FW_Shared.cs

Public Static Class FW_Shared
{
    public static string OrgCode = "Test123";
    public static string Username = "Tester";
    public static string Password = "Password";

    public static void Perform_Login(string OrgCode, string Username, string Password)
    {
        Try
        {
            Driver.Url = "http://test.app.com/";
            Driver.FindElement(By.Id("org_code")).SendKeys(OrgCode);
            Driver.FindElement(By.Id("username")).SendKeys(Username);
            Driver.FindElement(By.Id("password")).SendKeys(Password);
            Driver.FindElemenet(By.Id("btnsubmit)).Click();
        }
        Catch (Exception)
        {
             throw;
        }
        return true;
    }
}

Now I know that throwing the Exception to be caught is generally useless in typical coding as you want to handle specific exceptions that are returned, but I want to be able to catch any general web page or element issues so the test can fail on a general issue with the web application. For instance:

  • If the web page returns 503 or 404 issues
  • If an element is not present on the current web page
  • If an elements name has changed.

There is points in testing other, more complicated parts of the application that I handle unaccessible parts/elements with true/false bool returns and assert that, but since I am referencing multiple function across different classes would sticking with what I have be best, moving to top-level catching of all lower exceptions, or should I be doing something else?

Aucun commentaire:

Enregistrer un commentaire