确定Web应用程序是否在UI测试模式下运行

时间:2013-08-06 20:36:16

标签: testing web-applications gui-testing

我试图找出确定我是否正在为Web应用程序运行UI测试的最佳方法。我尝试这样做的原因是因为如果我正在运行UI测试,这些测试的唯一目的是确保UI正常工作并且这样做,它们应该针对模拟A​​PI运行(我们有一个单独的集合集成测试,以确保UI和真正的后端API一起正常工作)。同样模拟API调用将使测试测试运行得更快,这是模拟它们的另一个原因。我认为UI的这些“单元测试”。

我也不想拥有相同代码库的2个单独副本,其中一切都是相同的,除了UI测试版本包括javascript文件,该文件模拟了UI测试正常运行所需的所有必需调用。如果我能够弄清楚我在UI测试模式下运行应用程序,那么我将能够知道是否包含javascript文件来模拟调用。

有没有“标准”或“接受”方式来做这样的事情?

2 个答案:

答案 0 :(得分:0)

当你开始运行测试时 - 在数据库中引发一个标志,你可以调用一个服务来检查那个标志。确保在测试结束后关闭该标志。

答案 1 :(得分:0)

“是否有标准接受方式做这样的事情的简短回答?”将是:不。

这主要是因为您根本不希望您的UI完全了解此类信息。您希望自己的界面只是 您的用户界面。一旦你的用户界面开始根据它是处于“测试模式”还是“生产模式”做出一些决定,你就会走上一条滑坡,最终导致一场噩梦般的代码库。

这并不意味着你的问题无法解决;只是应该以不同的方式处理解决方案。我将首先解释没有任何语言细节的一般原则,然后为javascript提供一些指导。

一般原则

您努力解决这个问题的唯一原因是您的UI与API紧密耦合。

当您希望使用模拟时,解决方案恰好与任何情况完全相同。

  1. 编程到接口,而不是实现。 (确保您的UI仅绑定到API的抽象 - 而不是“真实/生产API”。)
  2. 将实例与交互分开。 (不要让你的UI创建任何API依赖项,因为它将它绑定到特定的实现 - 而是在UI上提供接口,以便为它提供应该使用的特定API实例。)
  3. 编程到界面

      

    首先请注意,上述短语并不意味着您的语言需要支持“ interface ”构造。 (这只是一些语言实现者对名称的不幸选择。)

    • 定义一个基类/对象,它定义了API应支持的每个方法/消息。 (但是,这些都不会在基类/对象上实现。)
    • 您的UI应具有APIInterface的变量/字段/引用。
    • 您的UI将通过接口引用从API调用所需的方法。例如。 APIRef.DoMethod1(...)APIRef->DoMethod1(...)[APIRef DoMethod1:...]等。

    从交互中单独实例化

    这里要避免的是:

    CreateUI {
      APIRef = CreateAPI;
    }
    

    以上将您的UI绑定到特定实现,并强制您在UI代码中包含这些文件/依赖项。您希望告诉您的UI使用哪个API。 E.g。

    CreateUI(APIInterface APIToUse) { //NB: Notice that the type use to refer 
                                      //to the API is the abstract base type 
                                      //defined earlier (keeping to the "Program 
                                      //to an interface" principle).
      APIRef = APIToUse;
    }
    //or
    SetAPI(APIInterface APIToUse) {
      APIRef = APIToUse;
    }
    

    现在您的生产应用程序看起来像这样:

    API = CreateTrueAPI;
    UI = CreateUI(API);
    

    尽管您的测试应用程序看起来像这样:

    API = CreateMockAPI;
    UI = CreateUI(API);
    

    请注意,在此解决方案中,您的UI没有关于“测试模式”或“生产模式”的线索。它只使用它给出的API。唯一知道“测试模式”(以某种方式)和模拟API的是测试应用程序。

    将原则应用于Javascript

    首先,让我说明一下:虽然我熟悉Javascript的语言原则,但我从未做过JS开发。因此可能会出现一些无法预料的并发症。然而,在最糟糕的情况下,通过一些调整和研究,我相信你会想出一些东西。

    Javascript支持duck-typing,这基本上意味着你可以向任何对象发送任何消息,并且在运行时对象将决定它是否可以实际处理消息。你没有编译时检查你没有输入任何拼写错误,但据我所知:你根本不需要定义抽象基础接口。
    所以......

    • 只需确保您的UI具有对API对象的引用。
    • 确保您的用户界面不包含任何 API实施文件(真实/生产版本和模拟版本)。
    • 在您的生产主机中创建真正的API,创建UI并将真正的API传递给UI。
    • 在测试主机中创建模拟API,创建UI并将模拟API传递给UI。