65.9K
CodeProject 正在变化。 阅读更多。
Home

Xenon

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (4投票s)

2014年11月6日

CPOL

3分钟阅读

viewsIcon

13446

Xenon 是一个帮助您编写稳定验收测试的框架

引言

Xenon 是一个框架,有助于使用流畅的 API 编写稳定的(非易变的)验收测试。我们目前仅支持 Selenium 浏览器自动化,但如果需要,我们将实现更多功能。

使用此框架的优势在于,您不必担心页面加载所需的时间,也不必担心您的元素被动态添加到页面中。所有这些都是使用预等待和后等待在内部处理的。这些等待不会减慢速度,因为一旦元素出现在页面上,它就会与之交互。如果您想等待一些不寻常的东西,您可以使用自定义的预等待和后等待来实现这一点。

背景

我们编写这个框架是因为我们的构建服务器上一直困扰着我们一个问题。我们的测试无论何时都通过和失败。我们会花费大量时间尝试修复测试,但几天后却发现它们再次失败。

然后,我们提出了 Xenon,以使我们的测试始终以巨大的成功通过。现在,我们所有的测试始终都通过(除非我们破坏了某些东西),我们希望它也能为您做到这一点。

Using the Code

设置 Xenon

安装

您可以从我们的 GitHub 存储库 此处 下载源代码并自行编译。您还可以从 nuget 安装它

由于目前 selenium 是唯一受支持的浏览器自动化框架,我们建议您使用 Xenon.Selenium,因为 Xenon 仅包含核心代码,并且需要您手动实现浏览器自动化端。

配置

要使用 selenium,您必须设置一些东西(只需要做一次)

设置选项
XenonTestOptions.Options = new XenonTestOptions
{
    //This is required as we did no make Xenon framework depend on any particular test framework
    //So you have to specify you test frameworks assert method
    Assert.Method = (passed, message) => Assert.IsTrue(passed, message),

    //This is optional and specifies how many seconds Xenon should wait for something to happen
    //By default this is 5
    WaitForSeconds = 10
}

测试

编写测试(基本)

使用我们的流畅 API 编写简单但可靠的测试很容易。如下所示(我们将在本例中使用 selenium 并在 Google 上搜索内容)

void TestMethod(){
    //This setups the browser so that it can be used in the test
    var browser = new SeleniumXenonBrowser( new ChromeDriver() );
    new XenonTest( browser )
        .GoToUrl( "http://www.google.co.uk" )
        .EnterText( "[name='q']", "Xenon is amazing" )
        .Click( "[name='btnG']" )
        .Assert( a => a.PageContains( "results") );
}

即使转到结果页面需要一段时间,此测试现在也将可靠地通过,因为 Xenon 将让浏览器有机会转到该页面,然后才会失败。

编写此测试对于简单的测试来说很好,但是当测试变得更加复杂时,我们创建了屏幕,下面将解释这些屏幕。

编写测试(使用屏幕)

要编写更复杂的测试,您可以使用屏幕。这些允许您在所有测试中重复使用通用代码。要创建屏幕,您编写一个继承自 XenonScreen 的类,如下所示

public class GoogleHomeScreen : XenonScreen<GoogleHomeScreen>{
    public GoogleHomeScreen( IXenonBrowser browser ) : base( browser ){
        GoToUrl( "http://www.google.co.uk" );
    }

    public GoogleSearchResultsScreen Search( string text ){
        return EnterText( "input[name='q']" )
            .Click( "[name='btnK']" )
            .Switch<GoogleSearchResultsScreen>();
    }
}

public class GoogleSearchResultsScreen : XenonScreen<GoogleSearchResultsScreen>{
    public GoogleSearchResultsScreen( IXenonBrowser browser ) : base( browser ){}
} 

然后您可以编写您的测试,如下所示

void TestMethod(){
    new GoogleHomeScreen( new SeleniumXenonBrowser( new ChromeDriver() )
        .Search( "Xenon is the best" )
        .Assert( a => a.PageContains( "results" ) );
}

使用断言 API

断言 API 是 Xenon 的核心部分之一,它可以在整个框架的多个地方使用。它允许您使用流畅的语法对多件事进行断言。每当使用此方法时,Xenon 始终会给您的 Assert 方法时间通过,以防浏览器因某种原因而花费时间。

它可用于所有 XenonTest/XenonScreen 方法中的 customPreWait 和 customPostWait,这在单击按钮应等待 Ajax 调用完成并将数据输出到页面,然后继续的情况下非常有用。 

new XenonTest( //browser )
    .Click( "#loadData", customPostWait: a => a.PageContains( "Data Loaded" ) );

它也可以在 Xenon 测试方法的 Assert 方法中使用,以确保当前页面状态与预期匹配。Assert 方法的一个主要优点是它可以在测试的多个点中使用,因此您可以确保它按预期进行。

new XenonTest( //browser )
    .GoToUrl( "http://www.google.co.uk" )
    .Assert( a => a.PageContains( "Google" ) )
    .EnterText( "[name='q']", "Xenon is amazing" )
    .Click( "[name='btnG']" )
    .Assert( a => a.PageContains( "results") );

如果断言 API 不包含您要查找的断言类型,则一切都不会丢失。因为有一个 CustomAssertion 方法,它允许您使用浏览器直接编写自己的断言。使用此方法不会影响测试的可靠性。

Assert( a => a.CustomAssertion( b => b.Url == "www.google.co.uk", "Custom message on failure" ) );

注释

如果您想查看我们的源代码,您可以在我们的 GitHub 存储库 此处 访问它。

如果您有任何建议或问题,请在下面发表评论或在 GitHub 上提出问题。

© . All rights reserved.