顶级iOS测试框架

您知道吗,
市场是2.5亿+?
发生崩溃后,有11%的iOS用户删除了该应用
发生崩溃后,有45%的iOS用户会删除付费应用
首次崩溃后,有69%的iOS用户将停止玩游戏并删除游戏
每秒售出6–7个iOS设备

随着iOS设备的逐年爆炸,iOS成功的边缘比以往任何时候都高。 越来越多的初创企业和中小型企业发现,购买具有不同操作系统版本和硬件规格的每台iOS设备在财务上都不可持续。 另一方面,由于效率和可伸缩性问题,手动测试应用或游戏不再是质量检查流程的理想选择。

尽管与Android相比,iOS仍然是一个更加封闭的操作系统,但是许多开放源代码测试自动化框架和工具都可以用来创建可靠的自动化测试。 借助基于云的测试解决方案,它使开发人员/测试人员能够以可扩展的方式更有效地验证应用质量,并使iOS测试任务更加轻松。

今天,我们今天将通过5个简单的示例代码来介绍5个广泛使用的iOS测试框架,以使您对开始进行iOS测试具有基本的了解。 如果您还对Android测试自动化框架感兴趣,请不要忘记查看前5个Android测试框架,其中还提供了代码示例。

阿皮

由于其在Android和iOS上的灵活性和可用性而广受欢迎,并且可以在本机,混合和Web应用程序上运行。 对于iOS测试,它使用JSONWireProtocol使用Selenium WebDriver与iOS应用程序进行交互。 为此,Appium确实很好地支持了移动Web测试,并且其用例非常相似,就好像Selenium将用于Web测试一样。

鸦片样本

driver.findElement(By.id(“ com.example.app:id/radio0”))。click();
driver.findElement(By.id(“ com.example.app:id/radio1”))。click();
driver.findElement(By.id(“ com.example.app:id/radio2”))。click();
driver.findElement(By.id(“ com.example.app:id/editText1”))。click();
driver.findElement(By.id(“ com.example.app:id/editText1”))。sendKeys(“简单测试”);
driver.findElement(By.name(“ Answer”))。click();
//或使用
driver.findElement(By.id(“ com.example.app:id/button1”))。click();

XCTest与Xcode紧密结合,但仍可用于实际的iOS设备和模拟器。 XCTest允许开发人员为任何级别的组件编写测试,并提供UI测试功能的框架。 XCTest测试被分组为XCTestCase的子类。 使用XCTest编写任何测试对于iOS开发人员来说应该是微不足道的,因为XCTest与Objective-C和Swift完全兼容。

KIF(保持功能)是一个与XCTest测试目标紧密相关并使用XCTest测试目标的iOS集成测试框架。 可以在XCTestCase或任何子类中直接执行KIF测试。 KIF通过利用OS系统为视力障碍者提供的可访问性属性,轻松实现iOS应用程序的自动化。

带有目标C的代码示例

–(void)testClicksOnRadioButtons {
[测试人员tapViewWithAccessibilityLabel:@“ Radio1”]];
[测试器tapViewWithAccessibilityLabel:@“ Radio2”];
[测试人员tapViewWithAccessibilityLabel:@“ Radio3”]];
[测试人员enterText:@“简单测试”
intoViewWithAccessibilityLabel:@” editText1”];
[测试人员tapViewWithAccessibilityLabel:@“答案”]];
}

带SWIFT的代码示例

testClicksOnRadioButtons(){
让app = XCUIApplication()
app.radiobutton [0] .tap()
app.radiobutton [1] .tap()
app.radiobutton [2] .tap()

app.staticTexts [“简单测试”]
app.button [0] .tap()
}

阅读我们的博客以了解和开始使用KIF:如何开始使用KIF?

Calabash是另一个出色的跨平台框架,可与Android和iOS应用完美配合。 与其他框架的主要区别之一是Calabash测试是用Cucumber编写的。 这意味着该测试的编写就像是一个规范,即使对于非技术人员来说也很容易阅读,但是仍然可以由自动化系统执行。

CALABASH代码示例

功能:回答问题功能
场景:作为有效用户,我想回答应用程序问题
我等待文本“在数百个设备上测试应用程序的最佳方法是什么?”
然后我按单选按钮0
然后我按单选按钮1
然后我按单选按钮2
然后,我在ID为“ editText1”的字段中输入文本“ Simple Test”
然后我按下ID为“ Button1”的视图

在某种程度上,EarlGrey是“ iOS浓缩咖啡”。 它也是由Google开发和开源的。 Google使用此测试框架来测试许多iOS本机应用程序,包括Google Calendar,YouTube等。随着代号的发展,Espresso和EarlGrey之间可以发现很多相似之处。 例如,EarlGrey测试将在尝试与UI交互之前自动等待事件(动画,网络请求等)。

早期代码示例

–(void)testBasicSelectionAndAction {
[[[EarlGrey selectElementWithMatcher :: grey_accessibilityID(@” ClickHere”))]
performAction:grey_tap()];

//带有EarlGrey匹配器的长按示例
–(void)testLongPress {
[[[EarlGrey selectElementWithMatcher :: grey_accessibilityLabel(@“ Box”

)]
performAction:grey_longPressWithDuration(0.5f)];
[[[EarlGrey selectElementWithMatcher :: grey_accessibilityLabel(@”长按一次”))
assertWithMatcher:grey_sufficientlyVisible()];

//多选可见项目的示例
–(void)testCollectionMatchers {
id visibleSendButtonMatcher =
grey_allOf(grey_accessibilityID(@“ Box”),grey_sufficientlyVisible(),nil);
[[EarlGrey selectElementWithMatcher:visibleSendButtonMatcher]
performAction:grey_tap()];
}

Jest使用Jasmine行为驱动的框架作为测试JavaScript代码的基础。 每个测试用例都从describe()函数调用开始,类似于JUnit使用TestCase类的方式。 describe()函数采用2个参数-测试用例的描述/标题和要执行的函数。 it()函数包含所有测试步骤,并提供(类似于JUnit)一系列Expect()函数。

茉莉花代码示例

describe(“ Player”,function(){
var player;
var song;
beforeEach(function(){
player = new Player();
song =新的Song();
});
它(“应该能够播放一首歌曲”,function(){
player.play(歌曲);
Expect(player.currentlyPlayingSong).toEqual(song);
//演示自定义匹配器的使用
Expect(player).toBePlaying(song);
});
describe(“歌曲已暂停时”,function(){
beforeEach(function(){
player.play(歌曲);
player.pause();
});

它(“应指示歌曲已暂停”,function(){
Expect(player.isPlaying).toBeFalsy();
//通过自定义匹配器演示’not’的使用
Expect(player).not.toBePlaying(song);
});
它(“应该可以恢复”,function(){
player.resume();
Expect(player.isPlaying).toBeTruthy();
Expect(player.currentlyPlayingSong).toEqual(song);
});
});
//演示使用间谍来拦截和测试方法调用
它(“如果用户喜欢,则显示当前歌曲”,function(){
spyOn(song,’persistFavoriteStatus’);
player.play(歌曲);
player.makeFavorite();
Expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true);
});
//演示预期异常的使用
describe(“#resume”,function(){
它(“如果已经在播放歌曲,则应该抛出异常”,function(){
player.play(歌曲);
Expect(function(){
player.resume();
})。toThrow(“歌曲已经在播放”);
});
});
});

UI Automation是Apple开发的工具,可自动执行iOS应用程序的测试。 换句话说,iOS的UI自动化与Android的UI Automator相似。 UI Automation测试使用JavaScript编写,并遵循Apple定义的API。 以下是在Apple开发人员门户上编写的代码。

注意! 如果您使用的是旧版本的Xcode,则UI自动化仍然可以正常工作,但是对于最新的Xcode,Apple不赞成使用整个UI自动化框架。

UI自动化代码示例

UIATarget.localTarget()。frontMostApp()。mainWindow()。buttons()[0]
如果“编辑”按钮是代码中的第一个按钮,则还可以具有以下代码:
UIATarget.localTarget()。frontMostApp()。mainWindow()。buttons()[“编辑”]
然后,您可以使用以下三种方式中的任何一种来调用动作以点击该按钮:
UIATarget.localTarget()。frontMostApp()。mainWindow()。buttons()[0] .tap();
UIATarget.localTarget()。frontMostApp()。mainWindow()。buttons()[“ Edit”]。tap();
var editButton = UIATarget.localTarget()。frontMostApp()。mainWindow()。buttons()[0];
editButton.tap();
自动化仪器具有完整的元素层次结构,可以代表应用程序的用户界面。 要查看该层次结构,请使用logElementTree方法将其轮廓写入日志:
UIATarget.localTarget()。frontMostApp()。logElementTree()

尽管iOS应用测试与Android应用测试完全不同,但是您可以使用Appium或Calabash来创建可用于进行跨平台测试的测试脚本。 话虽如此,每个框架都有其优势,每个项目的要求都是独特的。 建议做一些进一步的研究,了解每个框架的更多信息,然后选择您喜欢的框架。 快乐的iOS测试。