我试图找出确定我是否正在为Web应用程序运行UI测试的最佳方法。我尝试这样做的原因是因为如果我正在运行UI测试,这些测试的唯一目的是确保UI正常工作并且这样做,它们应该针对模拟API运行(我们有一个单独的集合集成测试,以确保UI和真正的后端API一起正常工作)。同样模拟API调用将使测试测试运行得更快,这是模拟它们的另一个原因。我认为UI的这些“单元测试”。
我也不想拥有相同代码库的2个单独副本,其中一切都是相同的,除了UI测试版本包括javascript文件,该文件模拟了UI测试正常运行所需的所有必需调用。如果我能够弄清楚我在UI测试模式下运行应用程序,那么我将能够知道是否包含javascript文件来模拟调用。
有没有“标准”或“接受”方式来做这样的事情?
答案 0 :(得分:0)
当你开始运行测试时 - 在数据库中引发一个标志,你可以调用一个服务来检查那个标志。确保在测试结束后关闭该标志。
答案 1 :(得分:0)
“是否有标准或接受方式做这样的事情的简短回答?”将是:不。
这主要是因为您根本不希望您的UI完全了解此类信息。您希望自己的界面只是 您的用户界面。一旦你的用户界面开始根据它是处于“测试模式”还是“生产模式”做出一些决定,你就会走上一条滑坡,最终导致一场噩梦般的代码库。
这并不意味着你的问题无法解决;只是应该以不同的方式处理解决方案。我将首先解释没有任何语言细节的一般原则,然后为javascript提供一些指导。
您努力解决这个问题的唯一原因是您的UI与API紧密耦合。
当您希望使用模拟时,解决方案恰好与任何情况完全相同。
首先请注意,上述短语并不意味着您的语言需要支持“ interface ”构造。 (这只是一些语言实现者对名称的不幸选择。)
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的语言原则,但我从未做过JS开发。因此可能会出现一些无法预料的并发症。然而,在最糟糕的情况下,通过一些调整和研究,我相信你会想出一些东西。
Javascript支持duck-typing,这基本上意味着你可以向任何对象发送任何消息,并且在运行时对象将决定它是否可以实际处理消息。你没有编译时检查你没有输入任何拼写错误,但据我所知:你根本不需要定义抽象基础接口。
所以......