Tag: Stuart开发人员

斯图尔特的苹果派食谱

我们如何在Stuart为我们的本机iOS应用程序运行自动化的UI测试。 每个厨师都有自己的食谱。 苹果派可以用多种样式制作,每种都可以用自己的方式美味……但是,有一个我们最喜欢的特殊食谱。 让我向您展示质​​量保证团队为在我们的iOS应用上执行UI测试而构建的Stuart测试框架配方。 我将通过苹果 , 烤锡和我们选择的面粉与您交谈。 苹果 我要谈的第一个要素是测试框架,即我们的“苹果”。 有几个选项,例如Appium,EarlGrey,Calabash,但我们选择了XCTest。 但为什么? 这是苹果公司支持的框架(我们知道他们正在努力使它年复一年地变得更好); 它将完全集成在应用程序代码中。 这为我们的iOS开发人员添加/修复测试打开了一扇门,并且是一种鼓励他们(当然,是质量检查小组!)为同一功能请求中的每个功能或错误修正添加测试的方式。 最后但并非最不重要的一点是,我们可以在UI测试和单元测试之间共享模拟,这使得编写新测试非常顺利。 烤锡 选择合适的苹果后,我们要使馅饼变大。 当我切成薄片时,我个人讨厌它,它会破裂,因此Stuart Apple蛋糕将不得不抵制所做的更改并使外观保持惊人。 在开始做任何事情之前,我们必须先喘口气,然后想想在我们的项目中遵循哪种架构。 我们希望在使代码可重用且易于维护的同时保持简单性。 为了满足这些需求,页面对象模式将用于对应用程序的屏幕进行建模。 我们还将使用机器人模式,以将与应用程序的所有交互封装在一个地方。 测试将使用屏幕与应用程序进行交互,屏幕将使用机器人执行操作(即查找元素,获取文本,点击,滑动…)。 此外,我们创建了一个不同的应用程序目标,以使应用程序与测试脱钩。 这使我们可以在应用程序目标(和其他一些文件)中创建模拟,以定义这些模拟的默认值。 例如,我们有一个模拟客户端(在具有应用程序目标的文件中定义),将具有firstName John和lastName Doe。 这些变量在两个目标都共享的文件中定义,并且仅包含静态数据,因此即使我们要在测试目标中执行断言(甚至使用它构建模拟),我们也可以引用该数据。 面粉 馅饼几乎已经准备好放入烤箱了,但是我们错过了最后一个(也许是最重要的)配料:面粉。 普通面粉可以胜任,但优质面粉可以发挥作用。 我说“面粉”是什么意思? 我们不想通过我们的测试打入网络! 这些测试的目的是检查我们的应用程序的UI在特定的交互后是否以特定的方式运行。 如果由于API返回有效值但我们期望有所不同而导致测试失败,该怎么办? 如果网络请求花费太长时间怎么办? 测试可能会失败。 我们不希望每次由于网络请求而导致测试失败或(或者更糟)习惯于失败的测试时都收到烦人的通知。 我们对可以使我们实现该目标的内容进行了一些研究。 我们发现有趣的选项是OHHTTPStubs,Embassy / Ambassador,MockServer。 每个人都有优点和缺点,但是……我们的最终决定不是所有这些! 主要原因是我们不想在项目中添加外部依赖关系和/或维护大量API响应。 因此,我们使用了不同的方法。 让我们一步一步走。 我们要确保我们的APIClient不会影响网络。 让我们在APIClient中添加几行代码来完成工作并初始化我们的URLSession: 但是……我们如何知道测试是否为UITest以及MockUrlSession是什么 ? 请耐心等待我的朋友,细节来了! 为了让该应用知道我们是否正在运行测试,让我们使用Apple提供给我们的一个很棒的功能:launchArgument和launchEnvironment。 在每次测试执行之前,我们将启动一个参数,指示我们正在运行测试。 […]