测量自动化测试步骤执行时间

Measuring Automation Test Step Execution Time

我有 10 个测试方法,每个方法都有一些自动化的业务功能,例如 Login(), CreateSomeRecord(), EditSomeRecord(), DeleteSomeRecord(), etc.

我还有一份 HTML 报告,它将捕获在测试方法中完成的操作(基本上捕获测试步骤)。像这样:

1. Enter Username: user01   User Entered Successfully   Pass
2. Enter Password: pass01   Pass Entered Successfully   Pass
3. Click Login button       Login successful            Pass

我基本上是根据代码逐行构建 HTML 文件。 现在,我想再添加一列以捕获持续时间 - 完成特定步骤所花费的时间。

所以,我正在做这样的事情:

// Initializing a new instance of the Stopwatch class
Stopwatch stopWatch = new Stopwatch();
TimeSpan ts;
string elapsedTime;

//Username field
stopWatch.Start();
WpfEdit usrName = new WpfEdit(wpfWndObj);
#region Search Criteria
usrName.SearchProperties[WpfEdit.PropertyNames.AutomationId] = "Usertxt";
usrName.WindowTitles.Add("My Test Application");
#endregion
Keyboard.SendKeys(usrName, usn); //usn has my username value in it
stopWatch.Stop();
ts = stopWatch.Elapsed;
elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
//Writing a new row into my HTML report
RptRowValueAdd(ReportDt, "", "Enter Username: " + usn, "Username Entered Successfully", "Pass", "", elapsedTime);
stopWatch.Reset();

RptRowValueAdd 函数的内容

//DataTable tblObj is a dataset.
//I am writing the report into data-set first before writing it into a HTML file
public void RptRowValueAdd(DataTable tblObj, String TcName, String StepName, String ActRes, String Status, String ScrShtName, String TotalTimer = "", String BeginTimer = "", String EndTimer = "", String TestMethodName = "")
{
    tblObj.NewRow();
    tblObj.Rows.Add(ReportRowValue, TcName, StepName, ActRes, Status, ScrShtName,TotalTimer);
    ReportRowValue = ReportRowValue + 1;
}

这确实有效,但想象一下编写启动秒表、停止秒表、计算经过的时间然后重置它所涉及的时间。我需要为写入 HTML 报告文件的每一行执行此操作。

一想到10个测试方法都这么搞就开始麻烦了

有没有更好的编码方式?

我不是在寻找任何基于分析器 (ANTS) 的解决方案。我知道探查器就是为此目的而存在的,但我想了解是否有更好的方法来处理我当前从代码中所做的事情。

谢谢指导。

我想我遗漏了一些细节,比如 RptRowValueAdd 中发生的事情——你怎么知道用户名输入成功并且测试通过了?无论如何,也许这种方法会给你一些想法。

有一个 class 表示每个测试的数据:

public class TestDetails
{
    public string TestName { get; set; }
    public string ResultDescription { get; set; }
    public Result TestResult { get; set; }
    public string ElapsedTime { get; set; }

    public TestDetails(string testName, string resultDescription, Result result, string elapsedTime)
    {
        ResultDescription = resultDescription;
        TestResult = result;
        ElapsedTime = elapsedTime;
    }

    public enum Result
    {
        Pass,
        Fail
        // etc
    }
}

然后,创建一个将测试作为操作参数和returns测试详细信息的方法。

    public static TestDetails RunTest(Action testMethod)
    {
        var sw = new Stopwatch();
        TimeSpan ts;
        string elapsedTime;
        sw.Start();
        testMethod.Invoke();
        sw.Stop();
        ts = sw.Elapsed;
        elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);

        return new TestDetails("Enter username: ", "Username entered Successfully", TestDetails.Result.Pass, elapsedTime);
    }

要使用这些,您可以创建一个操作方法列表,您可以向其中添加所有测试并在 foreach 中调用它们:

        var tests = new List<Action>
        (
            Login,
            CreateSomeRecord,
            EditSomeRecord,
            DeleteSomeRecord
        );

        foreach (var test in tests)
        {
            var testDetails = RunTest(test);
            RptRowValueAdd(ReportDt, "", testDetails.TestName, testDetails.ResultDescription, testDetails.TestResult.ToString(), testDetails.ElapsedTime);
        }

希望我没有误会你。

谢谢

首先,正如我在您的几个问题中指出的那样,我不会像您所说明的那样进行测试。您需要测试方法以某种特定顺序执行。此外,您要求断言在每种情况下都是 运行 ,即使它们已被验证有效。例如,您在 Enter User Name 方法中的所有断言都将 运行 用于涉及设置用户名的每个业务流程。这种做法违背了自行测试登录的目的。在设置用户名的测试通过后,所有其他测试都可以假设它有效。 根据断言,每次执行断言的时间都会大大增加。

也就是说,我会创建一些单独的东西来协调您的测试。此编排 class 可以具有与每个步骤关联的计时。但是,不清楚您是如何使用这些时间的(如果有的话)。

我的博客对此进行了介绍,但为了强调它的外观:

// orchestrates login user action
interface ILoginActions
{
    // logs in the user and returns a reference to the account settings page
    // which appears after successful login
    IAccountSettings Login(string username, string password);
}

public class LoginActions : ILoginActions
{
    public readonly ILoginPage loginPage;
    public LoginActions(ILoginPage loginPage)
    {
        this.loginPage = loginPage;
    }

    public IAccountSettings Login(string username, string password)
    {
        // the orchestrator does not typically need to make assertions,
        // and can assume that there are tests for Login actions
        stopWatch.Start();

        var model = 
        this.loginPage
            .Username.SetValue(username)
            .Password.SetValue(password)
            .Login.Click();

        stopWatch.Stop();

        log("Login Timing", stopWatch.Elapsed);

        return model;
    }
}

重申一下,上述编排class 存在的前提是不使用编排class.

的登录页面有全套测试。

他们自己的测试方法中的时间必须按照您已经确定的方式完成,或者可能与@Mvarta 的答案混合。