簡體   English   中英

將Xcode 5中的各個XCTest單元測試用例定位到通用應用程序的特定iOS設備?

[英]Target individual XCTest unit test cases in Xcode 5 to a specific iOS device for a universal app?

我正在構建一個通用的iPhone / iPad應用程序,並且在某些情況下,UI明顯不同(即,在iPhone上,我們將Master / Detail范例與TableViews一起使用,而在iPad上,我們將CollectionView與包含詳細信息的單元格一起使用) 。

因為接口是如此不同,所以它改變了構造視圖控制器的單元測試的方式。 在集合視圖中,我們必須進行測試以確保正確構建了單元並包含所有詳細信息,而在iPhone上,我們需要進行兩組測試-一組用於主列表,一組用於詳細屏幕。

所以我的問題是,在使用Xcode 5和XCTest框架構建的通用應用程序中,您可以針對要在特定物理設備上運行的單個單元測試用例/類嗎?

我在這里遇到了一個類似的問題-iOS單元測試通用應用程序 -但是問問者的意圖不同,並且正在使用較舊的技術。

我還看到了建議對UserInterfaceIdiom的單個測試功能進行檢查的建議,但這似乎很粗糙。 理想情況下,應該有一個注釋,用於指定在特定設備上運行的特定測試,或者能夠為特定設備指定整個測試類別。

預先感謝您的建議。

- 編輯 -

@TommieC引導我走了一條合適的道路,如果是一些小手冊。 我創建了兩種新的測試專用方案,一種用於手機大小的設備,另一種用於平板電腦的設備。 在這些方案中,我編輯了測試部分,並將其與特定於設備的測試一起添加到了核心測試中。

然后,我讓詹金斯執行兩個構建步驟,將適當的設備作為目標以測試特定的方案。 這種方法的缺點是兩個構建步驟。 但是,我計划拆分jenkins作業,並在2個從站上運行它,並在每個從站上連接適當的設備以並行化測試。

AFAIK還將對Xcode Build Services友好,因為它也基於項目中的方案工作。 實在太糟糕了,XCTest並沒有內置更優雅的功能,考慮到在使用新設備類型(手表/電視/吹風機/等)的情況下,縮放效果不佳

要針對特定​​設備的測試,需要編輯項目的方案。 在產品>方案>編輯方案下,可以選擇為每個設備選擇特定於設備的測試。

方案編輯

這是我提出的解決方案。

將您的測試分為iPhone特定測試和iPad特定測試。

現在添加專門用於iPhone或iPad的新Target(可可觸摸單元測試套件)。 如果您已經編寫了許多通用測試,則最好還是復制當前的測試目標。

現在,通過單擊導航器中的類,然后打開“實用程序”面板,確保僅將iPhone特定的測試類包括在iPhone測試目標中。 您可以使用“目標成員資格”復選框設置班級所屬的目標。

目標會員面板

要對此進行擴展,可以為兩個目標添加不同的方案,以更快地運行測試。

我一直想做同樣的事情,並且遇到了這個舊帖子。 我的解決方案涉及將特定的設備測試命名為“ Pad”或“ Phone”結尾,然后過濾測試列表以包括當前設備的測試:

class MyTests: XCTestCase {
    override class var defaultTestSuite: XCTestSuite {
        let suite = XCTestSuite(forTestCaseClass: MyTests.self)

        let newSuite = XCTestSuite(name: "MyTests")
        for test in suite.tests {
            // Name is of the form "-[MyTests test*]"
            if test.name.hasSuffix("Pad]") {
                // iPad only test
                if UIDevice.current.userInterfaceIdiom == .pad {
                    newSuite.addTest(test)
                }
            }
            else if test.name.hasSuffix("Phone]") {
                // iPhone only test
                if UIDevice.current.userInterfaceIdiom == .phone {
                    newSuite.addTest(test)
                }
            }
            else {
                // Can run on both devices
                newSuite.addTest(test)
            }
        }

        return newSuite
    }

    func testAll() { // All devices test }
    func testOnlyPad() { // iPad only test }
    func testOnlyPhone() { // iPhone only test }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM