Set Test Execution Time Limit

In some automation scenarios it is necessary to limit a single test execution to a certain time frame. That is possible if the following approach is used. In an execution extension library is set timer that is re-set each time the new test starts. If the time expired before the timer is re-set - all processes related to test execution are killed. This will ensure if a test takes more than initially defined time interval to stop its execution and continue with the next test. Bellow is given sample execution extension library with time frame set to 5 minutes.


public class ExecutionTimeout : IExecutionExtension
{
    System.Timers.Timer stopWatch;
    int timeout = 300000;

    // After each test is completed, ArtOfTest.Runner calls this method.
    // <param name="executionContext">The execution context the test is running under.</param>
    // <param name="result">The actual result of the test.</param>
    public void OnAfterTestCompleted(ExecutionContext executionContext, TestResult result)
    {
        if (!executionContext.ExecutingTestAsStep && !executionContext.RunFromHereStepExecuted)
        {
            stopWatch.Stop();
        }
    }

    // After the test list is completed, the Scheduling Server calls this method.
    // <param name="result">The entire RunResult object.</param>
    public void OnAfterTestListCompleted(RunResult result)
    {
       // Your custom implementation here.
    }

    // Before the test list begins execution, the Scheduling Server calls this method.
    // <param name="list">The test list that is about to start.</param>
    public void OnBeforeTestListStarted(TestList list)
    {
       // Your custom implementation here
    }

    // Before a test is about to start, ArtOfTest.Runner calls this method.
    // <param name="executionContext">The execution context the test is running under.</param>
    // <param name="test">The test we are about to start running.</param>
    public void OnBeforeTestStarted(ExecutionContext executionContext, ArtOfTest.WebAii.Design.ProjectModel.Test test)
    {
        Console.WriteLine(" --- Timer is ON --- ");
        if (!executionContext.ExecutingTestAsStep && !executionContext.RunFromHereStepExecuted)
        {
            stopWatch = new System.Timers.Timer(timeout);
            stopWatch.Elapsed += StopWatchElapsed;
            stopWatch.Start();
        }
    }

    // Use this to return your own data source.
    // <param name="executionContext">The execution context.</param>
    public System.Data.DataTable OnInitializeDataSource(ExecutionContext executionContext)
    {
        // Your custom implementation here
        return null;
    }

    // Called only on a step failure.
    // <param name="executionContext">The execution context a test is running under.</param>
    // <param name="stepResult">The step result that just failed.</param>
    public void OnStepFailure(ExecutionContext executionContext, ArtOfTest.WebAii.Design.AutomationStepResult stepResult)
    {
        // Your custom implementation here
    }

    private void StopWatchElapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        var procsToKill = new string[] { "iexplore", "Chrome", "Safari", "firefox" };

        foreach (string pr in procsToKill)
        {
            KillProcessByName(pr);
            Console.WriteLine(" --- The process '{0}' is terminated --- ", pr);
        }
    }

    public void KillProcessByName(string procname)
    {
        Process[] processes = Process.GetProcessesByName(procname);

        foreach (Process process in processes)
        {
            try
            {
               process.Kill();
            }
            catch (Exception ex)
            {
                Console.Write(ex.ToString());
            }
        }
    }
}

Public Class ExecutionTimeout
    Implements IExecutionExtension
    Private stopWatch As System.Timers.Timer
    Private timeout As Integer = 300000

    ' After each test is completed, ArtOfTest.Runner calls this method.
    ' <param name="executionContext">The execution context the test is running under.</param>
    ' <param name="result">The actual result of the test.</param>
    Public Sub OnAfterTestCompleted(executionContext As ExecutionContext, result As TestResult)
        If Not executionContext.ExecutingTestAsStep AndAlso Not executionContext.RunFromHereStepExecuted Then
            stopWatch.[Stop]()
        End If
    End Sub

    ' After the test list is completed, the Scheduling Server calls this method.
    ' <param name="result">The entire RunResult object.</param>
    Public Sub OnAfterTestListCompleted(result As RunResult)
        ' Your custom implementation here.
    End Sub

    ' Before the test list begins execution, the Scheduling Server calls this method.
    ' <param name="list">The test list that is about to start.</param>
    Public Sub OnBeforeTestListStarted(list As TestList)
        ' Your custom implementation here
    End Sub

    ' Before a test is about to start, ArtOfTest.Runner calls this method.
    ' <param name="executionContext">The execution context the test is running under.</param>
    ' <param name="test">The test we are about to start running.</param>
    Public Sub OnBeforeTestStarted(executionContext As ExecutionContext, test As ArtOfTest.WebAii.Design.ProjectModel.Test)
        Console.WriteLine(" --- Timer is ON --- ")
        If Not executionContext.ExecutingTestAsStep AndAlso Not executionContext.RunFromHereStepExecuted Then
            stopWatch = New System.Timers.Timer(timeout)
            AddHandler stopWatch.Elapsed, AddressOf StopWatchElapsed
            stopWatch.Start()
        End If
    End Sub

    ' Use this to return your own data source.
    ' <param name="executionContext">The execution context.</param>
    Public Function OnInitializeDataSource(executionContext As ExecutionContext) As System.Data.DataTable
        ' Your custom implementation here
        Return Nothing
    End Function

    ' Called only on a step failure.
    ' <param name="executionContext">The execution context a test is running under.</param>
    ' <param name="stepResult">The step result that just failed.</param>

    Public Sub OnStepFailure(executionContext As ExecutionContext, stepResult As ArtOfTest.WebAii.Design.AutomationStepResult)
        ' Your custom implementation here
    End Sub

    Private Sub StopWatchElapsed(sender As Object, e As System.Timers.ElapsedEventArgs)
        Dim procsToKill = New String() {"iexplore", "Chrome", "Safari", "firefox"}

        For Each pr As String In procsToKill
            KillProcessByName(pr)
            Console.WriteLine(" --- The process '{0}' is terminated --- ", pr)
        Next
    End Sub

    Public Sub KillProcessByName(procname As String)
        Dim processes As Process() = Process.GetProcessesByName(procname)

        For Each process__1 As Process In processes
            Try
                process__1.Kill()
            Catch ex As Exception
                Console.Write(ex.ToString())
            End Try
        Next
    End Sub
End Class