IOS UI testimise raamistikud

Allikas: Teadmusbaas

Koos avatud lähtekoodiga IOS testimis raamistikega ja pilve põhise testimis lahendusega on arendajatel ja testijatel võimalik APP-i kvaliteeti kontrollida lihtsasti ja efektiivselt. Järgnevas loetlus on välja toodud 5 kõige laialdasemalt kasutatud raamistikku ja ka nende näidiskoodid.


1. APPIUM

Appium on populaarne tänu paindlikusele ja kasutusvõimalustele nii IOSil kui ka Androidil. IOS testimiseks kasutab Appium JSONWireProtocoli, et ühenduda IOS rakendustega kasutades Selenium WebDriver. Selle tõttu ei toeta Appium mobiilset veebi testimist väga hästi.

Appium näisidkood:
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("Simple Test");
driver.findElement(By.name("Answer")).click();
// või alternatiiv driver.findElement(By.id("com.example.app:id/button1")).click();

2. XCTEST/KIF

XCTest on tugevalt seotud Xcode-iga kuid on siiski kasutusvõimeline nii päris IOS seadmetega kui ka simulaatoritega. XCTest võimaldab arendajatel kirjutada teste komponentidele igal tasemel. Samuti annab ka raamistiku UI testimiseks. XCTest testid on grupitatud XCTestCase alaklassidesse. Testide kirjutamine XCTest-iga peaks olema IOS arendajatele tühine kuna XCTest toetab täielikult nii Objective-C kui ka Swift.

Objective-C koodinäidis:
- (void)testClicksOnRadioButtons {
[tester tapViewWithAccessibilityLabel:@”Radio1”];
[tester tapViewWithAccessibilityLabel:@”Radio2”];
[tester tapViewWithAccessibilityLabel:@”Radio3”];
[tester enterText:@”Simple Test”
intoViewWithAccessibilityLabel:@”editText1”];
[tester tapViewWithAccessibilityLabel:@”Answer”];
}

Swift koodinäidis:
testClicksOnRadioButtons() {
let app = XCUIApplication()
app.radiobutton[0].tap()
app.radiobutton[1].tap()
app.radiobutton[2].tap()

app.staticTexts[“Simple Test”]
app.button[0].tap()
}

3. CALABASH

Calabash on samuti hea platvormiüleste raamistik mis töötab perfektselt nii IOS kui ka Android rakendustega. Üks suuremaid erinevusi Calabash ja teiste raamistike vahel on see, et Calabash testid on kirjutatud Cucumber-is. See tähendab seda, et kood on kirjutatud täpsustustega mis muudab kasutamise ja koodi lugemise lihtsaks ka inimesele kes ei ole infotehnoloogiaga väga kursis. Calablash on siiski käivitatav automatiseeritud süsteemi poolt.

Calabash näidiskood:
Feature: Answer the Question feature
Scenario: As a valid user I want to answer app question
I wait for text "What is the best way to test application on hundred devices?"
Then I press Radio button 0
Then I press Radio button 1
Then I press Radio button 2
Then I enter text "Simple Test" into field with id "editText1"
Then I press view with id "Button1"

4. EARLGREY

EarlGrey on areandatud avatud lähtekoodiga Google poolt. Google kasutab seda testimis raamistiku, et testida paljusid IOS baas rakendusi ja samuti ka nende enda rakendusi, milleks on näiteks Google kalender ja Youtube. Espresso ja EarlGrey vahel on palju sarnasusi. Näiteks EarlGrey testid ootavad automaatselt ära sündmused (animatsioonid jne).

EarlGray koodinäidis

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

- (void)testLongPress {
[[EarlGrey selectElementWithMatcher::grey_accessibilityLabel(@"Box")]
performAction:grey_longPressWithDuration(0.5f)];
[[EarlGrey selectElementWithMatcher::grey_accessibilityLabel(@"One Long Press")]
assertWithMatcher:grey_sufficientlyVisible()];

- (void)testCollectionMatchers {
id visibleSendButtonMatcher =
grey_allOf(grey_accessibilityID(@"Box"), grey_sufficientlyVisible(), nil);
[[EarlGrey selectElementWithMatcher:visibleSendButtonMatcher]
performAction:grey_tap()];
}

5. JEST / JASMINE

Jens kasutab Jasmine käitumisel raamistiku JavaScript testimise aluseks.

Jasmine koodinäidis

describe("Player", function() {
var player;
var song;
beforeEach(function() {
player = new Player();
song = new Song();
});
it("should be able to play a Song", function() {
player.play(song);
expect(player.currentlyPlayingSong).toEqual(song);
//demonstrates use of custom matcher
expect(player).toBePlaying(song);
});
describe("when song has been paused", function() {
beforeEach(function() {
player.play(song);
player.pause();
});

it("should indicate the song is paused", function() {
expect(player.isPlaying).toBeFalsy();
// demonstrates use of 'not' with a custom matcher
expect(player).not.toBePlaying(song);
});
it("should be possible to resume", function() {
player.resume();
expect(player.isPlaying).toBeTruthy();
expect(player.currentlyPlayingSong).toEqual(song);
});
});
it("tells the current song if the user has made it a favorite", function() {
spyOn(song, 'persistFavoriteStatus');
player.play(song);
player.makeFavorite();
expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true);
});
describe("#resume", function() {
it("should throw an exception if song is already playing", function() {
player.play(song);
expect(function() {
player.resume();
}).toThrow("song is already playing");
});
});
});