测量自动化测试步骤执行时间
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 的答案混合。
我有 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 的答案混合。