iOS
XCTest framework - Unit Testing
Buscar..
Agregando archivos de prueba a Xcode Project
Al crear el proyecto.
Debe marcar "Incluir pruebas unitarias" en el cuadro de diálogo de creación de proyecto.
Después de crear el proyecto.
Si no revisó ese elemento mientras creaba su proyecto, siempre podría agregar archivos de prueba más tarde. Para hacerlo:
1- Ve a la configuración de tu proyecto en Xcode
2- Ir a "Objetivos"
3- Haga clic en "Agregar objetivo"
4- En "Otro", seleccione "Paquete de prueba de prueba de unidad de cacao táctil"
Al final, debe tener un archivo llamado [Your app name]Tests.swift
. En Objective-C, debe tener dos archivos llamados [Your app name]Tests.h
[Your app name]Tests.m
en [Your app name]Tests.m
lugar.
[Your app name]Tests.swift or .m
archivo [Your app name]Tests.swift or .m
incluirá de forma predeterminada:
- Una importación del módulo
XCTest
- Una clase de
[Your app name]Tests
que amplíaXCTestCase
-
setUp
,tearDown
,testExample
,testPerformanceExample
Rápido
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.
}
}
}
C objetivo
#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
Agregando Storyboard y View Controller como instancias al archivo de prueba
Para comenzar con las pruebas unitarias, que se realizarán en el archivo de pruebas y se probarán el Controlador de vista y el Guión gráfico, debemos introducir estos dos archivos en el archivo de prueba.
Definiendo el controlador de vista
Rápido
var viewController : ViewController!
Presentando el Storyboard e inicializando el controlador de vista
Agregue este código al método setUp()
:
Rápido
let storyboard = UIStoryboard(name: "Main", bundle: nil)
viewController = storyboard.instantiateInitialViewController() as! ViewController
C objetivo
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:"Main" bundle:nil];
viewController = (ViewController *) [storyboard instantiateInitialViewController];
De esta manera, podría escribir métodos de prueba, y ellos sabrán dónde verificar errores. En este caso, hay View Controller y el Storyboard.
Añadiendo métodos de prueba.
Según Apple:
Métodos de prueba
Un método de prueba es un método de instancia de una clase de prueba que comienza con la prueba de prefijo, no toma parámetros y devuelve vacío, por ejemplo, (void) testColorIsRed (). Un método de prueba ejerce código en su proyecto y, si ese código no produce el resultado esperado, informa fallas usando un conjunto de API de aserción. Por ejemplo, el valor de retorno de una función podría compararse con un valor esperado o su prueba podría afirmar que el uso incorrecto de un método en una de sus clases produce una excepción.
Así que agregamos un método de prueba usando "prueba" como el prefijo del método, como:
Rápido
func testSomething() {
}
C objetivo
- (void)testSomething {
}
Para probar realmente los resultados, usamos el método XCTAssert()
, que toma una expresión booleana, y si es verdadero, marca la prueba como exitosa, de lo contrario, la marcará como fallida.
Digamos que tenemos un método en la clase View Controller llamado sum()
que calcula la suma de dos números. Para probarlo, utilizamos este método:
Rápido
func testSum(){
let result = viewController.sum(4, and: 5)
XCTAssertEqual(result, 9)
}
C objetivo
- (void)testSum {
int result = [viewController sum:4 and:5];
XCTAssertEqual(result, 9);
}
Nota
De forma predeterminada, no puede acceder a la etiqueta, el cuadro de texto u otros elementos de la interfaz de usuario de la clase View Controller desde la clase de prueba si se crean por primera vez en un archivo de Storyboard. Esto se debe a que se inicializan en el método
loadView()
de la clase View Controller, y no se llamará al realizar la prueba. La mejor manera de llamar aloadView()
y todos los demás métodos requeridos es acceder a la propiedad deview
de nuestra propiedadviewController
. Debe agregar esta línea antes de probar los elementos de la interfaz de usuario:
XCTAssertNotNil(viewController.view)
Empezar a probar
Probando un método específico
Para probar un método específico, haga clic en el cuadrado junto a la definición del método.
Probando todos los métodos
Para probar todos los métodos, haga clic en el cuadrado junto a la definición de clase.
Ver el resultado de la prueba.
Si hay una marca verde al lado de la definición, la prueba ha tenido éxito.
Si hay una cruz roja junto a la definición, la prueba ha fallado.
Ejecutando todas las pruebas
Product -> Test OR Cmd + U
¡Se ejecutarán todas las pruebas de todos los objetivos de prueba!
Importar un módulo que pueda ser probado.
Las clases, estructuras, enumeraciones y todos sus métodos son internal
por defecto. Esto significa que solo se puede acceder desde el mismo módulo. Los casos de prueba están en un objetivo diferente y esto significa que están en un módulo diferente. Para poder acceder al método que desea probar, necesita importar el módulo a probar usando la palabra clave @testable
.
Digamos que tenemos un módulo principal llamado ToDo
y queremos escribir pruebas para él. Importaríamos ese módulo así:
@testable import ToDo
Todos los métodos de prueba en el archivo con esta declaración de importación ahora pueden acceder a todas internal
clases internal
, estructuras, enumeraciones y todos sus métodos internal
del módulo de ToDo
.
Nunca debe agregar los archivos con los elementos que desea probar al objetivo de la prueba, ya que esto puede llevar a errores difíciles de depurar.
Vista de gatillo de carga y apariencia.
Ver cargando
En una prueba para un controlador de vista, a veces desea activar la ejecución de loadView()
o viewDidLoad()
. Esto se puede hacer accediendo a la vista. Digamos que tiene una instancia de controlador de vista en su prueba llamada sut
(sistema bajo prueba), entonces el código se vería así:
XCTAssertNotNil(sut.view)
Ver apariencia
También puede activar los métodos viewWillAppear(_:)
y viewDidAppear(_:)
agregando el siguiente código:
sut.beginAppearanceTransition(true, animated: true)
sut.endAppearanceTransition()
Escribiendo una clase de prueba
import XCTest
@testable import PersonApp
class PersonTests: XCTestCase {
func test_completeName() {
let person = Person(firstName: "Josh", lastName: "Brown")
XCTAssertEqual(person.completeName(), "Josh Brown")
}
}
Ahora vamos a discutir lo que está pasando aquí. La línea de import XCTest
nos permitirá extender XCTestCase
y usar XCTAssertEqual
(entre otras afirmaciones). Extender XCTestCase
y prefijar nuestro nombre de test
con test
garantizará que Xcode ejecute automáticamente esta prueba cuando ejecute las pruebas en el proyecto ( ⌘U o Producto > Prueba ). La línea @testable import PersonApp
importará nuestro destino de PersonApp
para que podamos probar y usar clases desde él, como la Person
en nuestro ejemplo anterior. Y finalmente, nuestro XCTAssertEqual
se asegurará de que person.completeName()
sea igual a la cadena "Josh Brown"
.