- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自Android/Espresso背景,我仍在为XCUITest和UI测试进行挣扎。
我的问题是关于两个相关但截然不同的问题:
CommandLine.arguments
将启动参数从UI测试传递到被测应用。这样可以将特定于测试的配置应用于要测试的应用。但是,这些启动参数需要由应用程序解析和解释,这导致测试代码对应用程序造成污染。此外,启动参数只是更改被测应用程序行为的一种非交互方式。 UI Tests should not need to link to app code, they are designed to simulate a user tapping away inside your app. If you were to jump into the app code during these tests you would no longer be testing what your app does in the the real world you would be testing what it does when manipulated in a way no user ever could. UI tests should not have any need of any app code any more than a user does.
For UI tests you shouldn't have to pollute your app code too much. You could use a single command line argument to indicate UI tests are running and use that to load up some test data, login a test user, or pick a testing endpoint for network calls. With good architecture you will only need to make the adjustment once when the app first launches with the rest of your code oblivious that it is using test data (much like if you have a development environment and a production environment that you switch between for network calls).
最佳答案
UI测试不需要链接到应用程序代码,它们旨在模拟用户在您的应用程序内部轻敲。如果您要在这些测试中跳入应用程序代码,则不再需要测试您的应用程序在现实世界中的功能,而是在测试以任何用户无法操纵的方式操作时的功能。与用户相比,UI测试不需要任何应用程序代码。
当然,对于单元测试和集成测试,您可以使用@testable import …
来访问未标记为private
或fileprivate
的任何方法和属性。从测试代码中仍然无法访问标记为private
或fileprivate
的所有内容,但包括internal
在内的所有其他内容都将可访问。在这些测试中,您应该有意地添加一些在现实世界中不可能发生的数据,以确保您的代码可以处理它。这些测试仍不应进入方法并进行任何更改,否则该测试将不会真正测试代码的行为。
您可以在项目中创建任意数量的单元测试目标,并且可以使用这些目标中的一个或多个来进行集成测试而不是单元测试。然后,您可以指定在不同时间运行的目标,以免较慢的集成测试不会在每次测试时都运行并降低速度。
运行的环境单元和集成测试实际上包含了所有内容。您可以创建 View Controller 的实例,然后调用loadViewIfNeeded()
进行整个 View 设置。然后,您可以测试各种导出的存在并触发它们发送 Action (请查看UIControl
的sendActions(for: )
方法)。如果您已经设置了必要的模拟,这将使您验证当用户点击按钮A时,是否将调用发送到事物B的正确方法。
对于UI测试,您不必过多地污染您的应用程序代码。您可以使用单个命令行参数来指示UI测试正在运行,并使用该参数来加载一些测试数据,登录测试用户或为网络调用选择测试端点。拥有良好的架构,您只需在应用程序首次启动时进行一次调整,而其他代码则不会使用测试数据(就像您在开发环境和生产环境之间进行网络调用时切换一样) )。
如果您想了解有关测试Swift的更多信息,Paul Hudson有一本非常好的书,您可以查看https://www.hackingwithswift.com/store/testing-swift。它包含各种测试的大量示例,以及有关如何将它们分开的良好建议。
根据您的编辑和评论进行更新:
看起来您真正想要的是集成测试。这些在Xcode的世界中很容易错过,因为它们没有自己创建的目标。他们使用单元测试目标,但要一起测试多个项目。
前提是您尚未在任何商店中添加private
或fileprivate
,则可以在“单元测试”目标中创建测试,以确保这些商店存在,然后根据需要注入(inject)文本或触发其操作,以模拟用户浏览您的应用程序。
通常,这种测试只是从一个 View Controller 转到第二个 View Controller ,以测试在 Action 发生时是否创建了正确的 View Controller ,但是没有什么可以说不能继续进行的。
您不会像UI测试一样获得失败测试的屏幕图像,如果您使用 Storyboard ,请确保从 Storyboard 中实例化 View Controller 。请确保您正在捕获所有导航 Controller 以及所需的导航 Controller 。
这种方法学使您可以像浏览应用程序一样操作,同时能够处理各种方法所需的任何数据。
如果您有一个包含10行的方法,并且想要在第7行和第8行之间调整数据,则需要对某个可模拟对象进行外部调用,然后在其中进行更改,或者使用带有进行更改的调试器命令的断点。这个断点技巧对于调试事物非常有用,但是我不认为我会在测试中使用它,因为删除断点会破坏测试。
关于ios - XCUITest:如何跳入应用程序代码?如何修改被测应用程序的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59898746/
我正在尝试使用两个可编辑的 slickgrid 实例作为数据输入表单,我希望能够从第一个网格的最后一个单元格切换到第二个网格的第一个单元格,但以下内容没有' 似乎工作。我错过了什么? firstG
我正在通过 Alex Allain 的“Jumping into C++”等书籍学习 C++,并且正在学习递归。有一个程序示例可以计算出在出现“堆栈溢出错误”或在我的情况下出现“段错误”之前我的计算机
如果我像这个例子一样跳进一个 block ,跳过声明, #include int main(int argc, char *argv[]){ int counter = 0; goto ju
我是一名优秀的程序员,十分优秀!