Функция testSuiteWillStart в XCTestObservation вызывается при запуске тестов из Xcode

Я использую версию XCode - Версия 9.4.1 (9F2000).

Я пытаюсь создать пользовательские журналы для тестов, запущенных с XCUITest, переписав класс XCTestObservation и зарегистрировав его с помощью тестового класса.

Класс наблюдателя: TestObserver

class TestObserver : NSObject, XCTestObservation {

    public func testSuiteWillStart(_ testSuite: XCTestSuite) {
      print("I am inside function testSuiteWillStart --> \(testSuite)")
} }

Настройка в моем тестовом случае:

class MyTestCase: XCTestCase{

override class func setUp() {
    super.setUp()
    XCTestObservationCenter.shared.addTestObserver(TestObserver())
}}

Я попытался запустить test, используя Xcode и Fastlane, но функция testSuiteWillStart не вызывается вообще. Кто-нибудь сталкивался с подобной проблемой?

2 ответа

Функция testSuiteWillStartбудет вызываться только при добавлении Test Observer,

Вы можете добавить наблюдателя, используя следующую строку кода:

      XCTestObservationCenter.shared.addTestObserver(observer) //observer is instance of object that confirms to XCTestObservation

Шаги, которые необходимо выполнить:

  1. Создайте класс, подтверждающий XCTestObservationпротокол
  2. Добавить имя класса в тестовый пакет для ключа NSPrincipalClass

Шаг 1:

      class SOTestObserver: NSObject, XCTestObservation {


    override init() {
        super.init()
        XCTestObservationCenter.shared.addTestObserver(self)
    }

    func testBundleWillStart(_ testBundle: Bundle) {
        print("---## \(#function), URL: \(testBundle.bundleURL)")
    }
}

Шаг 2:

если в имени вашего проекта есть пробел, например My Appзатем добавьте следующее в info.plist

      <key>NSPrincipalClass</key>
<string>My_AppUITests.SOTestObserver</string> 

если в имени вашего проекта нет пробелов, добавьте следующее

      <key>NSPrincipalClass</key>
<string>$(PRODUCT_NAME).SOTestObserver</string> 

Вам нужно позвонить своим наблюдателям в UITest info.plist. Info.plist, создайте новый ключ "Principal Class" и присвойте ему значение TestTarget. Например, UITests.TestObserver

В то время как ваш класс testobserver должен выглядеть так

class TestObserver: NSObject, XCTestObservation {
    override init() {
        super.init()
        XCTestObservationCenter.shared().addTestObserver(self)
    }
   func testBundleWillStart(_ testBundle: Bundle) {
    print ("start")
   }
}
Другие вопросы по тегам