İçeriğe geç

iOS ile UI Test Automation

Merhabalar bu yazımda iOS ile UI Test işlemini uygulamalarınızda nasıl kullanabileceğinizi sizlerle paylaşacağım.

iOS ile UI Test yaparken bir önceki yazımda eklediğim iskelet üzerine ve belirlenen yapı ile uygulama içinde kullandığınız nesnelere erişmeniz ve aksiyonları tetiklemeniz gerekli. Örneğin accessibilityLabel değeri belirlenen buton veya tabloya erişmek için.

let app = XCUIApplication()
let field = app.textFields["TextLabel"]
field.tap()
field.typeText("123")

şeklinde bir kod yazmamız gerekli. Daha sonra arayüz eylemlerini tetikleyerek her hangi bir senaryoyu kontrol edebilirsiniz.

Test işlemi yapılacak UI nesneleri.

app.alerts.element
app.buttons.element
app.collectionViews.element
app.images.element
app.maps.element
app.navigationBars.element
app.pickers.element
app.progressIndicators.element
app.scrollViews.element
app.segmentedControls.element
app.staticTexts.element
app.switches.element
app.tabBars.element
app.tables.element
app.textFields.element
app.textViews.element
app.webViews.element

Nesneler üzerinde aşağıdaki verdiğim aksiyonları gerçekleştirebilirsiniz.

tap()
doubleTap()
twoFingerTap()
tap(withNumberOfTaps:numberOfTouches:)
press(forDuration:)
swipeLeft(), swipeRight(), swipeUp(), swipeDown()
pinch(withScale:velocity:)
rotate(_: withVelocity:)

Bu aksiyonların kontrolü için bazılarını verdiğim UI Test fonksiyonlarını çalıştırabilir, test işlemini gerçekleştirebilirsiniz. Aynı fonksiyonların Unit test işlemi içinde geçerli olduğunu unutmayalım.

XCTAssert()
XCTAssertEqual()
XCTAssertFalse()
XCTAssertNil()
XCTAssertThrowsError()
object.waitForExistence()

Aşağıda yazdığım basit bir UI Test uygulamasınıda sizlerle paylaşayım. 2 Adet sayfadan oluşan 1 adet field ve button bulunan bir uygulama.

ViewController:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var normalField: UITextField!
    @IBOutlet weak var loginButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        normalField.accessibilityLabel = "TextLabel"
        loginButton.accessibilityLabel = "Button"
    }

    @IBAction func buttonAction(_ sender: Any) {
        let alert = UIAlertController(title: "@@", message: "@@", preferredStyle: .alert)
        alert.accessibilityLabel = "Alert"
        let alertOK = UIAlertAction(title: "Ok", style: .default) { (_) in
            if self.normalField.text == Statics.password {
                self.performSegue(withIdentifier: "go2", sender: nil)
            }
        }
        alertOK.isEnabled = false
        alert.addAction(alertOK)
        present(alert, animated: true, completion: nil)
    }
}

UI Test VC:

import XCTest
@testable import TestosApp

class TestosAppUITests: XCTestCase {

    override func setUp() {
        continueAfterFailure = false
        XCUIApplication().launch()
    }

    override func tearDown() { }

    func loginTest() {
        let app = XCUIApplication()
        let field = app.textFields["TextLabel"]
        field.tap()
        field.typeText("123")
        XCTAssertEqual(field.value as! String, Statics.password)
        let button = app.buttons["Button"]
        button.tap()
        let appAlert = app.alerts["Alert"]
        _ = appAlert.waitForExistence(timeout: 1)
        let alertButton = app.alerts["@@"].buttons["Ok"]
        XCTAssertTrue(alertButton.isEnabled) //
        alertButton.tap()
        _ = app.waitForExistence(timeout: 1)
    }
}

setUp() blok içerisinde ilk başta yapılması gerken işlemler yazılır ve uygulama başlatılır. Daha sonrasında test edilecek fonksiyon bloğu çalıştırılır ve en son tearDown() bloğu çalışır. Bu bloklara test etmek ve eklemek istediğiniz kodları yazabilirsiniz.

Burada loginTest() çalıştırdığımız zaman işaretlediğim isEnabled false durumundan dolayı test başarısız oldu. Bu şekilde uygulamalarınızda modüler olarak parça parça fonksiyonları adlandırarak test yazabilirsiniz. Unutmamak gerekirki test yazmak ilk başta gereksiz ve zaman kaybı olarak görünebilir ama ilerleyen sürede ne kadar faydalı ve uygulama geliştirmenin en önemli süreçlerinden biri olduğunu göreceksiniz.

 

Kategori:UI Test

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Copyright © 2022 Kenan Atmaca