在本教程中,您将尝试执行以下测试操作: 在视图控制器中测试方法。 检查视图是否存在。 在当前状态下捕获屏幕截图 如果您遇到以下任何问题,可以在此处下载完整的源代码项目。 1.在视图控制器中测试方法 首先,您需要阅读以下来自Apple的文章: XC测试 为Xcode项目创建并运行单元测试,性能测试和UI测试。 定义测试用例和测试方法 将测试用例和测试方法添加到测试目标,以确认您的代码行为符合预期。 了解测试方法的设置和拆卸 测试运行前准备初始状态,测试完成后执行清理。 addTeardownBlock(_ 🙂 注册一个拆卸代码块,以在当前测试方法结束后运行。 测试期望的异步操作 验证异步操作的行为符合预期。 使用2个选项创建一个新项目,其中包括“包括单元测试”和“包括UI测试”已选中: 要在视图控制器中测试方法,您需要对其进行初始化。 在这种情况下,我们将通过UIStoryboard对其进行初始化。 将以下代码片段添加到您的DemoTests.swift文件中: 现在,您可以调用视图控制器的方法: 按Cmd + U运行测试 2.检查视图的存在 首先,您需要阅读以下来自Apple的文章: 用户界面测试 当执行预期的操作时,请确保您应用的用户界面行为正确。 XCUIElementQuery 用于查找UI元素的查询。 XCUI元素 应用程序中的UI元素。 XCUI应用 可以启动和终止的应用程序的代理。 首先,要能够测试UI元素,您需要启动您的应用程序。 将以下代码片段添加到您的DemoUITests.swift文件中 现在,您可以使用app变量查询UI元素: 按Cmd + U运行测试 3.在当前状态下捕获屏幕截图 首先,您需要阅读以下来自Apple的文章: 将测试分为具有活动的子步骤 在测试方法中创建命名活动以简化测试报告。 为测试和活动添加附件 使用附件存储测试的输出数据以供以后分析。 XCUI画面 连接到设备的物理屏幕。 XCUI截屏 屏幕,应用程序或UI元素状态的捕获图像。 要捕获当前状态的屏幕快照,可以使用以下代码片段: 按Cmd + […]
在WWDC 2017上,有一个关于可测试性工程的精彩演讲,重点关注测试代码以及应用程序代码质量的重要性。 演讲介绍了通过编写出色的测试代码来提高应用程序可测试性的各种方法。 最重要的一点是第二部分,其中分享了改善UI测试的可伸缩性的技巧。 在这篇文章中,我们将看到Apple工程师分享的那些技巧。 请记住,这不仅仅是在WWDC上发表的演讲的复制粘贴,本文还提供了一些在Github 可扩展XCUITest上的演示项目的真实示例,以证明这些观点。 WTF是可扩展的测试代码吗? 即使未在生产中执行,测试代码也与应用程序代码一样重要。 我们绝对应该使我们的应用程序可测试,但还要付出一些努力使测试代码更具可伸缩性。 因此,可扩展测试代码的好处是 更快地运行我们的测试 使我们的测试即使对于非技术人员也更具可读性 以更好的方式组织测试代码,避免重复 轻松添加新的测试用例 示例应用 让我们探讨一下Apple工程师共享的一些技巧,这些技巧可通过示例应用程序Expandable-XCUITest使测试代码可扩展 ,该应用程序具有6种不同颜色的按钮,分别是红色,绿色,蓝色,黑色,灰色和黄色。 这是一个非常简单的应用程序,但请想象我们必须测试一些东西,例如 轻按所有颜色 只需点击RBG颜色 点击非RBG颜色。 不可缩放的UI测试如下所示: func testTapAllColorNonScalable(){ XCUIApplication()。buttons [“ RED”]。tap() XCUIApplication()。buttons [“ BLUE”]。tap() XCUIApplication()。buttons [“ GREEN”]。tap() XCUIApplication()。buttons [“ BLACK”]。tap() XCUIApplication()。buttons [“ YELLOW”]。tap() XCUIApplication()。buttons [“ GRAY”]。tap() } 再次测试RGB和非RGB值,我们几乎必须重复同样的事情。 您可以在此处查看测试类Non_Scalable_XCUITestUITests.swift ,并猜测它有多混乱。 通过使用讲座中描述的技术,我们绝对可以做得更好。 编写可伸缩XCUITest的技巧 通过使用一些常见的面向对象的原理(例如抽象和封装),可以共享一些技巧以使测试可伸缩,可维护且更快。 让我们来看一些技巧 抽象的XCUIElement查询 如果存在多次使用XCUIElement查询的情况,请将其存储为变量。 在上面的示例中,我们点击了6次按钮,但唯一改变的是按钮的颜色。 我们可以轻松地将其包装到方法中。 […]
您必须接管多少次进行了单元测试的项目,但是这些项目很难掌握,拼命失败,或者甚至无法建立测试目标? 保持单元测试代码的健壮性和可维护性,而不是让它们随着时间的流逝而被遗弃和忽略,至关重要。 在Storytel,我们尝试使单元测试简短易读。 由于测试代码的性质,代码往往会增长很长且具有重复性,因此保持代码整洁很重要,然后随着项目的增长,进行测试的工作就不会变得太乏味。 有时,抛出的代码可能很难测试,并且最终的测试代码可能很难看。 在本文中,我将深入探讨不同的场景,以及如何以出色而强大的方式解决它们。 XCTest是一个功能强大的框架。 在Xcode 8.3中,Apple引入了几个新的XCTAssert函数,除了几个现有的函数。 尽管它们提供的功能允许执行开发人员希望执行的大多数操作,但某些操作仍然需要在本机提供的功能之上的样板代码。 让我们看看一些案例以及我们如何解决它们。 比较抛出函数的结果 这很容易。 现有的所有XCTAssert函数都已经带有抛出参数。 如果结果为Equatable ,则将执行以下操作: XCTAssertEqual(尝试x.calculateValue(),ExpectedValue) 如果calculateValue()引发错误,则测试失败,并显示消息“ XCTAssertEqual失败:引发错误…… ”。 如果调用未引发并且两个值不相等,则测试失败并显示消息“ XCTAssertEqual failed:a不等于b ”,其中“ a ”和“ b ”分别是由String(describing:) 。 简而言之,所有XCTAssert *值检查函数都会验证调用不会引发任何错误 并返回预期结果。 很方便。 具有非等于返回类型的函数 通常XCTAssertEqual及其值检查同级是不够的。 如果函数不返回值,或者在测试用例的上下文中可以将其忽略,则可以使用Xcode 8.3中可用的新XCTAssertNoThrow函数: XCTAssertNoThrow(尝试x.doSomething()) 有趣的是,在Xcode 8.3出现之前,我们有一个具有完全相同签名的自定义函数,除了删除自定义实现之外,我们无需更改任何代码。 另一种常见情况是,当返回的类型不是Equatable ,或者如果我们只想检查返回结果的某些属性。 即使类型是 当对象的描述很长时,相等的,相等的测试用例失败几乎是没有用的:很难确定哪个字段的值不正确: 在我们的项目中,我们有很多函数会产生不符合Equatable复杂类型。 一个常见的例子是数据模型对象-我们将它们公开为协议以隐藏内部实现,并且我们不希望它们是平等的。 每种模型类型都有一个带字典的引发初始化器。 在某个时候,我们意识到我们的单元测试看起来很可怕。 他们有重复的代码,没有意义的可选内容,并且当这些测试失败时,男孩们所有的东西都是红色的。 更糟糕的是,有很多复制粘贴。 代码如下: XCTAssertNoThrow(尝试BookObject(dictionary:sampleDictionary)) 让书=尝试? BookObject(字典:sampleDictionary) XCTAssertEqual(book?.name,“ […]
以前称为FBSnapshotTestCase和 目前由Uber维护, 此框架创建UIView的参考图像,并使用它们来测试同一视图的后续图像以检查它们是否相同。 uber / ios快照测试案例 ios-snapshot-test-case – iOS的快照视图单元测试 github.com 我发现了几个用例: 用代码编写UI 对我来说,这是一个很大的机会。 在我的团队中,我们已经不再使用xib和Storyboard,而是以编程方式创建所有UI。 一个明显的缺点是,直到运行应用程序,您才能看到UI的外观。 特别是在较大的应用程序中,这尤其麻烦,尤其是当您要查看的屏幕嵌套在导航堆栈的深处时。 通过使用iOSSnapshotTestCase,您可以通过运行测试并检查参考图像来检查视图。 UITesting 没有人喜欢编写测试。 那里有很多文章概述了烦恼 。 我发现使用iOSSnapshotTestCase创建测试相对简单。 在初始设置之后 ,通过子类化FBSnapshotTestCase而不是XCTest来创建测试。 然后将recordMode = true设置为允许在运行测试时生成参考图像。 最后创建一个实例化视图的测试,然后调用FBSnapshotVerifyView() 。 这是一个例子: 现在已经创建了参考图像,设置recordMode = false 。 现在,如果未对视图进行任何更改,则测试将通过! 使用FBSnapshotVerifyView() ,可以传递几个参数以提供更多控制。 如以下内容: FBSnapshotVerifyView(view, identitifer: “simpleView”, tolerance: 0.5) 在引擎盖下,它通过将视图渲染为两个CGContextRefs来比较视图。 然后,使用C函数memcmp()查看它们的内存,以确保它们相等。 自从遇到这个框架以来,我的工作流程已大大简化 。 我在大型应用程序上工作,并且能够在每次我要检查UI更改时不编译和运行该应用程序,从而节省了很多时间 。 这是一个简单但功能强大的工具,我建议人们尝试一下!
当通过命令行运行Xcodeunit testing用例时,我可以看到下面的日志。 命令: xcodebuild -project MyStore2.xcodeproj -scheme MyStore2 -configuration Debug -sdk iphonesimulator7.0 clean test 日志: Test Case '-[MyStore2Tests testIsTrue]' started. Test Case '-[MyStore2Tests testIsTrue]' passed (0.000 seconds). Test Suite 'MyStore2Tests' finished at 2014-07-14 13:01:58 +0000. Executed 2 tests, with 1 failure (0 unexpected) in 0.000 (0.000) seconds Test Suite 'MyStore2Tests.xctest' finished at 2014-07-14 13:01:58 +0000. […]
我正在尝试使用XCTest for SLComposeViewController编写unit testing用例,到目前为止找不到任何解决scheme。任何有关方法和代码的build议都会有所帮助。 我的目标是使用XCTesttesting下面的代码 SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; SLComposeViewControllerCompletionHandler __block completionHandler = ^(SLComposeViewControllerResult result) { [tweetSheet dismissViewControllerAnimated:YES completion:nil]; switch(result) { case SLComposeViewControllerResultCancelled: { [self showAlertWithTitle:nil andMsg:NSLocalizedString(@"Sharing failed", @"Workout summary text")]; } break; case SLComposeViewControllerResultDone: { [self showAlertWithTitle:NSLocalizedString(@"Success", @"Success") andMsg:NSLocalizedString(@"Message shared", @"Workout summary share text")]; } break; } };
不确定何时,但至less在Xcode 7.2中, XCTAssertEqualObjects不再可用。 有没有替代这个,而不必诉诸? XCTAssertTrue(foo == bar) 请注意,苹果公司的“编写testing类和方法”已经过时了,仍然是指缺less的类。
我是一个学习者的目标c,并开始做unit testing, 我想unit testing下面的对象 @interface Media : NSObject{ } @property (nonatomic, readonly) NSString *name; @property (nonatomic, readonly) NSString *sex; @property (nonatomic, readonly) NSString *Description; – (instancetype)initWithDictionary:(NSDictionary *)mediaData; @end #import "Media.h" @interface Media() @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *sex; @property (nonatomic, strong) NSString *Description; @end @implementation Media – (instancetype)initWithDictionary:(NSDictionary *)mediaData { self […]
当我运行我的unit testing脚本时,它在“ServiceTest”类中的“”waitForExpectationWithTimeout“崩溃。 如果我单独为这个“ServiceTest”类运行testing脚本,那么它运行正常,不会崩溃。 但是,如果我运行整个项目的testing脚本,我正在得到这个崩溃。 我无能为力,这是什么意思呢? 感谢任何帮助。 谢谢。
有一个单元格包含一个集合视图。 我已经使用集合视图设置单元格 cell.accessibilityLabel = @"daren_shangjia_0001_add_new_photo_album"; 然后在XCTest,我呢 print(app.debugDescription); 我没有看到我提供的accessibilityLabel。 Element subtree: →Application 0x608000367200: {{0.0, 0.0}, {414.0, 736.0}}, label: '纳豆行' Window 0x608000365e80: Main Window, {{0.0, 0.0}, {414.0, 736.0}} Other 0x608000365880: traits: 8589934592, {{0.0, 0.0}, {414.0, 736.0}} Other 0x608000365b80: traits: 8589934592, {{0.0, 0.0}, {414.0, 736.0}} Other 0x608000365700: traits: 8589934592, {{0.0, 0.0}, {414.0, 736.0}} Other 0x608000364d40: traits: 8589934592, {{0.0, […]