Тестовый пример пользовательского интерфейса не показывает покрытие кода

У меня есть несколько тестов, написанных с использованием классов XCTestCase, и я хочу рассчитать покрытие кода. Для обычного теста он хорошо отображается в моем боте, но для UI-тестов всегда 0%.

Самый простой тест:

import XCTest

class FAQUITests: XCTestCase {

    let app = XCUIApplication()        
    override func setUp() {
        super.setUp()
        app.launch()
    }

    func openFaqView() {
        app.navigationBars["NavigationBar"].buttons["FAQ"].tap()
    }

    func testFaq() {
        openFaqView()
        app.tables.cells.elementBoundByIndex(0).tap()
    }        

}

И это, безусловно, должно показать некоторое тестовое покрытие, но это не так. Я включил покрытие кода бота:

введите описание изображения здесь

И результат:

введите описание изображения здесь

Все равно 0%.

Xcode 7.2 (7C68)

РЕДАКТИРОВАТЬ: Пример проекта: https://[email protected]/Kettu/so_34718699.git


person Jakub    schedule 11.01.2016    source источник
comment
Ах, извините. Из вашего оригинала это звучало так, как будто вы ожидали, что это будет показано на скриншоте: D   -  person Fogmeister    schedule 11.01.2016
comment
Насколько я понимаю, невозможно записать покрытие кода для UI-тестов, потому что они не выполняются на уровне исходного кода.   -  person dasdom    schedule 11.01.2016
comment
Хм, @dasdom, звучит правдоподобно. Спасибо что подметил это.   -  person Jakub    schedule 11.01.2016
comment
Я считаю, что актуальной проблемой является тот факт, что во время тестов пользовательского интерфейса приложения запускаются не один раз, а несколько раз. Таким образом очень сложно записать правильное покрытие (включая ответвления). Придется реализовать некоторое интеллектуальное слияние, и приложение должно будет корректно завершать работу после каждого запуска. У нас были похожие проблемы с предыдущими версиями Xcode, а также с UIAutomation. Я считаю, что это задача с низким приоритетом для разработчиков Xcode. У нас даже нет способа получить информацию о покрытии для приложений Swift из Xcode. Это отображается только в пользовательском интерфейсе.   -  person Sulthan    schedule 23.01.2016


Ответы (2)


Проверьте, активна ли функция «Собрать данные о покрытии» в схеме тестирования.

Проверить сбор данных о покрытии

person alexem    schedule 30.06.2016

Это происходит, если у вас есть только цель тестирования пользовательского интерфейса. Добавьте цель модульного теста. А потом снова запустить тесты. На этот раз вы увидите покрытие кода.Образцы целей

введите здесь описание изображения

UITestcase не предоставляет данные о покрытии без кода модульного тестирования. Вы можете попробовать это. Имейте кнопку в вашем Viewcontroller, прикрепите к ней IBAction. И создайте для него UITestcase. Проверьте покрытие кода с UITestcases и без них. Вы бы увидели разницу. Разница даст вам покрытие кода UITestcase. На данный момент Xcode не предоставляет данные о покрытии кода отдельно. Это зависит от модульных тестов.

Тестовое покрытие без UI TestCase с тестовым набором пользовательского интерфейса

---В вашем коде я закомментировал ваш

функция testStepper() {

    let steppersQuery = app.steppers
    steppersQuery.buttons["Increment"].tap()
    steppersQuery.buttons["Decrement"].tap()
}

func testSegmented() {
    app.buttons["Second"].tap()
    app.buttons["Fourth"].tap()
    app.buttons["Third"].tap()
    app.buttons["First"].tap()

}

из TestDemoUITests, и в результате получилось следующее: без кода UITesting

А с вашим UITestcase это выглядит следующим образом: с UITestcase

Теперь совершенно очевидно, что UITestcase добавляется к Unit Testcase для покрытия кода.

person Arun Balakrishnan    schedule 25.01.2016
comment
Это НЕ покрытие из UI Tests - person Jakub; 25.01.2016
comment
Когда я закомментировал файл UI Tests. Это результат. - person Arun Balakrishnan; 25.01.2016
comment
Это то, что я сделал в примере проекта, который вы можете скачать из моего ответа. Покрытие кода не показано для метода из IBAction. - person Jakub; 25.01.2016
comment
Да, он срабатывает, например, viewDidLoad, потому что он запускает экран, но это не, например, метод buttonTapped, который срабатывает. Так что это не настоящее тестовое покрытие. Проверьте пример проекта, который я опубликовал, и попробуйте протестировать другой метод, кроме viewDidLoad, используя UITest. - person Jakub; 25.01.2016
comment
Посмотрите внимательно на результаты. Два метода segmentedControlValueChanged и stepperValueChanged вызываются для UITest, а не для модульного теста. Следовательно, общее покрытие тестами составляет менее 50% для проекта без UITests и около 80% с UITests. Таким образом, 80%-50% = 30% — это покрытие кода UITests. - person Arun Balakrishnan; 26.01.2016
comment
Вы совершенно правы. Тестирование пользовательского интерфейса увеличивает покрытие кода. Только что закончил пробный тест, который увеличил покрытие кода с 10,3% до 28%. - person Abdalrahman Shatou; 09.02.2021