|
2#
楼主 |
发表于 2018-4-13 15:36:59
|
只看该作者
复制代码
大部分代码是由Coded UI Test Builder自动生成的,我们只编写了TestSearchResult()方法,用来寻找控件
并获取到其中的值来进行判断。测试结果的判断通过Assert断言来完成,Assert提供了多种方法以帮助我们实
现不同的判断,具体的内容可以参考msdn。然后对RecordedMethod1()方法做了适当修改。TestSearchResu
lt()方法中对于如何查找和遍历UI控件在稍后的章节中会讨论到。然后我们将所有代码的调用放到CodedUITes
t1.cs文件中执行。
复制代码
- [TestMethod]
- public void CodedUITestMethod1()
- {
- UIMap1 uimap = new UIMap1();
- uimap.RecordedMethod1();
- uimap.TestSearchResult();
- }
复制代码
复制代码
现在可以通过Test Explorer窗口或者直接使用测试方法的上下文菜单运行或调试该测试方法。如果通过测
试,测试方法前面会显示绿色的图标,否则会显示红色的叉。Visual Studio会为每次测试生成对应的测试报告
,在工程目录下的TestResults文件夹中可以找到所有的测试报告。
有关Assert断言
在自动化测试中,Assert断言一旦遇到测试失败的情况就会抛出异常,从而导致接下来的测试方法或任
务不会继续执行。也就是说,如果一个测试工程中包含了诸多测试方法,经常的情况是一个测试工程中会包
含很多个测试类,每个类针对不同的测试用例,而每个测试类中又包含了很多个不同的测试方法。面对如此
庞大的一个测试工程,通常会花上数十分钟甚至数小时才能将预定好的所有测试方法跑完,我们当然不希望
看到由于某一个测试方法失败而导致剩下的所有测试方法均不能得到执行。在自动化测试中,测试方法测
试失败的情况是很普遍的,成功或失败都是一种结果,这总比程序运行到一半抛出异常要好得多。
然而,Assert断言总会在测试失败的时候抛出异常,从而终止程序运行。如下面的测试方法,如果前两
个断言中有任何一个失败的话,则剩下的断言不会被执行。
复制代码
- [TestMethod]
- public void CheckVariousSumResults()
- {
- Assert.AreEqual(3, this.Sum(1001, 1, 2));
- Assert.AreEqual(3, this.Sum(1, 1001, 2));
- Assert.AreEqual(3, this.Sum(1, 2, 1001));
- }
复制代码
复制代码
一个有效的解决办法是将每一个断言分别放到不同的测试方法中,如下面的代码:
复制代码
- [TestMethod]
- public void Sum_1001AsFirstParam_Returns3()
- {
- Assert.AreEqual(3, this.Sum(1001, 1, 2));
- }
- [TestMethod]
- public void Sum_1001AsMiddleParam_Returns3()
- {
- Assert.AreEqual(3, this.Sum(1, 1001, 2));
- }
- [TestMethod]
- public void Sum_1001AsThirdParam_Returns3()
- {
- Assert.AreEqual(3, this.Sum(1, 2, 1001));
- }
复制代码
复制代码
然而在大多数情况下这可能行不通。例如你需要测试一个包含100行的table,对每一行的title列进行text测试,在这种情况下你根本无法为每一个断言编写不同的测试方法。首先你无法确定测试方法的数量,其次过多的测试方法会增加维护成本。
另一种我听到过的解决方法是使用参数化测试,然而据我所知,Coded UI Test中好像并不支持。在其它测试环境中或许有更好的解决办法。
或许可以使用try-catch语句来截获Assert断言所抛出的异常,使程序能够继续运行下去。然后我们将所有截获到的异常信息输出到自定义的文件中,即自定义测试报告!测试报告可以是任意类型的文档,记事本或HTML比较常用。既然可以使用try-catch来截获Assert断言的异常欣喜,那么我们会很自然地想到使用下面的方法:
复制代码
- [TestMethod]
- public void CheckVariousSumResults()
- {
- MultiAssert.Aggregate(
- () => Assert.AreEqual(3, this.Sum(1001, 1, 2)),
- () => Assert.AreEqual(3, this.Sum(1, 1001, 2)),
- () => Assert.AreEqual(3, this.Sum(1, 2, 1001)));
- }
- public static class MultiAssert
- {
- public static void Aggregate(params Action[] actions)
- {
- var exceptions = new List<AssertFailedException>();
- foreach (var action in actions)
- {
- try
- {
- action();
- }
- catch (AssertFailedException ex)
- {
- exceptions.Add(ex);
- }
- }
- var assertionTexts =
- exceptions.Select(assertFailedException => assertFailedException.Message);
- if (0 != assertionTexts.Count())
- {
- throw new
- AssertFailedException(
- assertionTexts.Aggregate(
- (aggregatedMessage, next) => aggregatedMessage + Environment.NewLine + next));
- }
- }
- }
复制代码
复制代码
上面的代码可以很有效地解决问题,但仍会存在问题。MultiAssert.Aggreate()方法中过多的断言最终会
将所有的异常信息抛出,这会大大降低异常信息的可读性,不太利于我们从测试测试报告中分析出错的原因。
要知道,测试方法最终的目的不是要让测试程序运行通过,而是通过测试报告来分析被测试对象可能具有的
问题。
下面是一个例子,可以用来有效地解决上面提出的问题。
复制代码
- public static class AssertWrapper
- {
- public static string AreEqual<T>(T expected, T actual, string message)
- {
- string result = null;
- try
- {
- Assert.AreEqual(expected, actual, message);
- TestLog.WritePass(message);
- }
- catch (AssertFailedException ex)
- {
- result = ex.Message;
- TestLog.WriteError(message);
- }
- catch (Exception ex)
- {
- result = ex.Message;
- TestLog.WriteError(message);
- }
- return result;
- }
- public static string AreEqual(string expected, string actual, string message)
- {
- string result = null;
- try
- {
- Assert.AreEqual(expected, actual, message);
- TestLog.WritePass(message);
- }
- catch (AssertFailedException ex)
- {
- result = ex.Message;
- TestLog.WriteError(result);
- }
- catch (Exception ex)
- {
- result = ex.Message;
- TestLog.WriteError(result);
- }
- return result;
- }
- public static string AreEqual(string expected, string actual, bool ignorecase, string message)
- {
- string result = null;
- try
- {
- Assert.AreEqual(expected, actual, ignorecase, message);
- TestLog.WritePass(message);
- }
- catch (AssertFailedException ex)
- {
- result = ex.Message;
- TestLog.WriteError(result);
- }
- catch (Exception ex)
- {
- result = ex.Message;
- TestLog.WriteError(result);
- }
- return result;
- }
- public static string Fail(string message)
- {
- string result = null;
- try
- {
- Assert.Fail(message);
- }
- catch (AssertFailedException ex)
- {
- result = ex.Message;
- TestLog.WriteError(result);
- }
- return result;
- }
- }
复制代码
复制代码
AssertWrapper类中的方法可以有多个重载,以满足不同的需要,其基本思想就是使用try-catch语句
来截获Assert断言所抛出的异常。TestLog类中的方法负责写测试报告,你可以将测试报告定义成任何形式。
然后定义一个TestSettings类用来收集测试工程中所有的测试断言。
复制代码
public class TestSettings
{
public static void AddResult(List<string> resultList, string result)
{
if (result != null)
{
if (resultList == null)
{
resultList = new List<string>();
}
resultList.Add(result);
}
}
}
|
|