2016-12-08 15 views
0

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

Как настроить тесты интерфейса XCode для их повторного использования для различных продуктов? Я понимаю, мне нужны разные схемы. Но как насчет элементов видимости, например? Кажется, мне нужно проверить его внутри тестового кода пользовательского интерфейса? Но я думаю, что было бы лучше использовать любой файл конфигурации. Я прав? У кого-нибудь есть идеи? Я был бы благодарен за все советы.

ответ

0

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

func addItemToCart(named: String, saveButtonName: String) 
func login(username: String, password: String, submitButtonText: String) 
func tapTableCell(imageNamed: String) 

Как только вы создадите базовые строительные леса для навигации, вы можете перейти к помощникам утверждения. Оставляя сложную логику в хелперах, вы можете повторно использовать их и поддерживать тесты, ориентированные на продукт, на жесткие и читаемые.

func assertCurrentScreen(named: String) 
func assertHighlightedCell(colorNamed: String) 
func assertCartTotal(cents: String, containerIdentifier: String) 

Для всех этих функций, я рекомендую, добавив два параметра по умолчанию в конце отметить, звонящий файл и номер строки. Если вы сделаете какие-либо пользовательские утверждения, вы можете затем pass these references in to show your failure at the callers line, not the helpers.

func assertScreen(titled: String, file: StaticString = #file, line: UInt = #line) { 
    if !XCUIApplication().navigationBars[titled].exists { 
     XCTFail("Item was not added to cart.", file: file, line: line) 
    } 
} 

XCTest Helper Example

0

Я использую функцию в начале каждого теста.

class SomeTestsClass: XCTestCase { 
    func testSomeTest() { 
     var externalConfigVariable_1 = "value for defult test" 
     var externalConfigVariable_2 = "value for defult test" 

     // here You use the external config to override 
     // the default test logc 
     if let testConfig = getConfig(for: self.name) { 
      // read config parameters here 
      externalConfigVariable_1 = testConfig["test_var_1"] 
      externalConfigVariable_2 = testConfig["test_var_2"] 
      // .......... 
     } 

     // use the variables as You like 
     // ...... 
    } 
} 

extension XCTestCase { 
    public func getConfig(for name: String?) -> [String: Any]? { 
     let nameComponents = name?.replacingOccurrences(of: "-", with: "").replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "").components(separatedBy: " ") 

     if let fileName = nameComponents?.last { 
      let testBundle = Bundle(for: type(of: self)) 
      guard let path = testBundle.url(forResource: fileName, withExtension: "JSON") else { 
       return nil 
      } 

      if let data = try? Data(contentsOf: path) { 
       if let testConfig = (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)) as? [String: Any] { 
        return testConfig 
       } 
      } 
     } 

     return nil 
    } 
} 

Вот пример JSON:

{ 
    "test_var_1": "Some var", 
    "test_var_2": "Some other var" 
} 
+0

Да, я думал об этом, но я не имею опыт работы с ним. Можете ли вы показать пример для более подробной информации? – Yulia

+0

Я отредактировал ответ. Я написал пример (немного грубый, но работающий) для метода get config. и пример использования. –

+0

Также имейте в виду, что вы можете добавить 'XCTestCase' во все ваши тестовые цели и повторно использовать его. –