2017-02-13 21 views
3

Я пытаюсь настроить тест пользовательского интерфейса в своем проекте. Я делаю тест пользовательского интерфейса, который пытается войти в мою учетную запись для входа в приложение. Чтобы убедиться, что приглашение входа в систему отображается при запуске теста, я пытаюсь запустить ServerManager.logout(), который находится в кодовой базе проекта. Это приведет к появлению приглашения на ввод при запуске.Доступ к проекту кода из XCTestCase - UI Test

import XCTest 

class SmokeTest: XCTestCase { 

    override func setUp() { 
     super.setUp() 

     // Put setup code here. This method is called before the invocation of each test method in the class. 

     // In UI tests it is usually best to stop immediately when a failure occurs. 
     continueAfterFailure = false 
     // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 
     XCUIApplication().launch() 

     // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 
     ServerManager.logout() 
    } 

    func testLogin() { 

     let app = XCUIApplication() 

     let emailTextField = app.textFields["email textfield"] 
     emailTextField.tap() 
     emailTextField.typeText("[email protected]") 

     let passwordTextField = app.secureTextFields["password textfield"] 
     passwordTextField.tap() 
     passwordTextField.typeText("12345678") 

     let loginButton = app.buttons["log in button"] 
     loginButton.tap() 
    } 
} 

Как мне настроить мой проект, чтобы получить доступ к ServerManager?

Когда я проверил целевое членство для целевого объекта UITest (называемого DonkeyProductionUITests) в файле ServerManager.swift, Xcode начал жаловаться, что многие ссылки в этом файле не определены для цели UITest. Поэтому я добавил целевое членство для всех файлов моего проекта в UITest Target, включая все CocoaPods. Он решил большинство вопросов. Тем не менее у меня есть некоторые странные остатки:

Undefined reference

Какие исходные файлы если UITest цель иметь как «Источники Compile»?

Почему такие типы, как UIColor и UIViewController вдруг не распознаются Xcode?

ответ

2

Доступ к вашему проекту через @testable import возможен только в UnitTests. Когда вы работаете UITests это не работает, потому что во время UITest ваш тестовый класс не может получить доступ к вашему приложению.

От Apple's Docs:

тестирования UI отличается от модульного тестирования в основных направлениях. Модульное тестирование позволяет работать в пределах вашего приложения и позволяет вам осуществлять функции и методы с полным доступом к переменным вашего приложения и состоянию . UI-тестирование выполняет пользовательский интерфейс вашего приложения таким же образом, что и пользователи не имеют доступа к вашим внутренним методам, функциям и . Это позволяет вашим тестам видеть приложение так же, как это делает пользователь , обнаруживая проблемы пользовательского интерфейса, с которыми сталкиваются пользователи.

Если вы хотите выйти из системы после теста вы должны сделать это с помощью приложения интерфейса пользователя: Если есть кнопка выхода из системы где-то в вашем приложении, перейдите там в конце теста и дайте тест tap() это ,

+0

Awesome, спасибо! Но немного раздражает .. Я просто хочу убедиться, что приложение находится в правильном состоянии при запуске теста, но это, похоже, не используется для 'func setup()' ... Не могли бы вы добавить ссылку на ссылка от яблока? – Wiingaard

+0

Да, это немного неудобно, но вокруг не обойтись. Вы должны использовать пользовательский интерфейс вашего приложения, чтобы сбросить его после теста. Если вам нужно сделать это после каждого теста, вы можете переместить этот код в 'tearDown()'. Вот ссылка на документы: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/09-ui_testing.html – joern

+0

Не кажется ли вам, что это решение для запуска приложение с аргументами, например, это решение: http://stackoverflow.com/a/33466038/2299801 Спасибо :) – Wiingaard