iOS
Рамка XCTest - Единичное тестирование
Поиск…
Добавление тестовых файлов в проект Xcode
При создании проекта
В диалоговом окне создания проекта вы должны проверить «Включить тесты единиц».
После создания проекта
Если вы пропустили проверку этого элемента во время создания проекта, вы всегда можете добавить тестовые файлы позже. Для этого:
1- Перейдите к настройкам вашего проекта в Xcode
2- Перейдите в раздел «Цели»
3- Нажмите «Добавить цель»
4- В разделе «Другое» выберите «Пакет тестового тестирования сенсорного блока какао»,
В конце вы должны иметь файл с именем [Your app name]Tests.swift
. В Objective-C у вас должно быть два файла с именем [Your app name]Tests.h
и [Your app name]Tests.m
.
[Your app name]Tests.swift or .m
будет включать по умолчанию:
-
XCTest
модуляXCTest
- A
[Your app name]Tests
XCTestCase
класс, который расширяетXCTestCase
-
setUp
,tearDown
,testExample
,testPerformanceExample
методы
стриж
import XCTest
class MyProjectTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measure {
// Put the code you want to measure the time of here.
}
}
}
Objective-C
#import <XCTest/XCTest.h>
@interface MyProjectTests : XCTestCase
@end
@implementation MyProjectTests
- (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
}
- (void)testExample {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
// Put the code you want to measure the time of here.
}];
}
@end
Добавление Storyboard и View Controller в качестве экземпляров для проверки файла
Чтобы начать работу с модульного тестирования, который будет выполнен в файле тестов, и будет тестировать контроллер просмотра и раскадровки, мы должны ввести эти два файла в тестовый файл.
Определение контроллера просмотра
стриж
var viewController : ViewController!
Представляем раскадровку и инициализацию контроллера просмотра
Добавьте этот код в метод setUp()
:
стриж
let storyboard = UIStoryboard(name: "Main", bundle: nil)
viewController = storyboard.instantiateInitialViewController() as! ViewController
Objective-C
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:"Main" bundle:nil];
viewController = (ViewController *) [storyboard instantiateInitialViewController];
Таким образом, вы можете написать методы тестирования, и они будут знать, где можно проверить наличие ошибок. В этом случае есть View Controller и Storyboard.
Добавление методов тестирования
По словам Apple:
Методы испытаний
Метод тестирования - это метод экземпляра тестового класса, который начинается с теста префикса, не принимает параметров и возвращает void, например, (void) testColorIsRed (). Метод тестирования реализует код в вашем проекте и, если этот код не дает ожидаемого результата, сбои отчетов используют набор API-интерфейсов утверждения. Например, возвращаемое значение функции может сравниваться с ожидаемым значением или ваш тест может утверждать, что неправильное использование метода в одном из ваших классов вызывает исключение.
Поэтому мы добавляем тестовый метод, используя «тест» в качестве префикса метода, например:
стриж
func testSomething() {
}
Objective-C
- (void)testSomething {
}
Чтобы действительно проверить результаты, мы используем XCTAssert()
, который принимает логическое выражение, и если true, помечает тест как преуспевающий, иначе он будет отмечать его как неудачный.
Скажем, у нас есть метод в классе View Controller, называемый sum()
который вычисляет сумму двух чисел. Чтобы проверить это, мы используем этот метод:
стриж
func testSum(){
let result = viewController.sum(4, and: 5)
XCTAssertEqual(result, 9)
}
Objective-C
- (void)testSum {
int result = [viewController sum:4 and:5];
XCTAssertEqual(result, 9);
}
Заметка
По умолчанию вы не можете получить доступ к метке, текстовому полю или другим элементам пользовательского интерфейса класса View Controller из тестового класса, если они сначала сделаны в файле Storyboard. Это связано с тем, что они инициализируются в
loadView()
класса View Controller, и это не будет вызываться при тестировании. Лучший способ вызватьloadView()
и все другие необходимые методы - это доступ к свойствуview
нашего свойстваviewController
. Вы должны добавить эту строку перед тестированием элементов пользовательского интерфейса:
XCTAssertNotNil(viewController.view)
Начать тестирование
Тестирование определенного метода
Чтобы протестировать определенный метод, щелкните квадрат рядом с определением метода.
Тестирование всех методов
Чтобы проверить все методы, щелкните квадрат рядом с определением класса.
См. Результат тестирования
Если рядом с определением есть зеленый флажок, тест прошел успешно.
Если рядом с определением есть красный крест, тест не сработал.
Выполнение всех тестов
Product -> Test OR Cmd + U
Он будет запускать все тесты из всех тестовых целей!
Импортируйте модуль, который можно протестировать
Классы, структуры, перечисления и все их методы являются internal
по умолчанию. Это означает, что к ним можно получить доступ только из одного модуля. Тесты находятся в другой цели, это означает, что они находятся в другом модуле. Чтобы получить доступ к методу, который вы хотите протестировать, вам необходимо импортировать модуль для тестирования с использованием @testable
слова @testable
.
Предположим, у нас есть основной модуль под названием ToDo
и мы хотим написать для него тесты. Мы будем импортировать этот модуль следующим образом:
@testable import ToDo
Все методы тестирования в файле с этим оператором импорта теперь могут обращаться ко всем internal
классам, структурам, перечислениям и всем их internal
методам модуля ToDo
.
Вы никогда не должны добавлять файлы с элементами, которые хотите протестировать, в тестовую цель, поскольку это может привести к затруднению отладки ошибок.
Загрузка и появление триггера
Просмотр загрузки
В тесте для контроллера вида вы иногда должны запускать выполнение loadView()
или viewDidLoad()
. Это можно сделать, обратившись к представлению. Допустим, у вас есть экземпляр контроллера просмотра в вашем тесте под названием sut
(система под тестированием), тогда код будет выглядеть так:
XCTAssertNotNil(sut.view)
Внешний вид
Вы также можете запускать методы viewWillAppear(_:)
и viewDidAppear(_:)
путем добавления следующего кода:
sut.beginAppearanceTransition(true, animated: true)
sut.endAppearanceTransition()
Написание тестового класса
import XCTest
@testable import PersonApp
class PersonTests: XCTestCase {
func test_completeName() {
let person = Person(firstName: "Josh", lastName: "Brown")
XCTAssertEqual(person.completeName(), "Josh Brown")
}
}
Теперь давайте обсудим, что здесь происходит. Линия import XCTest
позволит нам расширить XCTestCase
и использовать XCTAssertEqual
(среди других утверждений). Расширение XCTestCase
и префикс нашего тестового имени с помощью test
гарантируют, что Xcode автоматически выполнит этот тест при выполнении тестов в проекте ( ⌘U или Product > Test ). @testable import PersonApp
линия @testable import PersonApp
импортирует нашу цель PersonApp
чтобы мы могли тестировать и использовать из нее классы, такие как Person
в нашем примере выше. И, наконец, наш XCTAssertEqual
гарантирует, что person.completeName()
будет равно строке "Josh Brown"
.