Я никогда не использовал Unit Testing, и я понимаю его использование, но я не знаю, когда и как его использовать.
Я хотел бы знать, когда стоит использовать Unit Testing, возможно, с некоторыми примерами.
Я никогда не использовал Unit Testing, и я понимаю его использование, но я не знаю, когда и как его использовать.
Я хотел бы знать, когда стоит использовать Unit Testing, возможно, с некоторыми примерами.
Вы должны почти всегда unit test, и вы должны написать код с модульными тестами. Экстремисты пишут тесты еще до написания кода (он называется TDD - Test Driven Development).
Я приведу вам пример реальной жизни: недавно мне пришлось кодировать отсортированный NSArray, который поддерживает "интервалы". Значение, массив должен знать, как вставить интервал и сохранить его отсортированным.
Например, массив будет выглядеть так: [1-3, 5-9, 12-50]. В этом примере в массиве есть 3 интервала, и, как видите, они сортируются. После того, как я написал свой класс (я назвал его IntervalsArray), я HAD, чтобы писать тесты, чтобы убедиться, что он работает правильно и что я его не "сломаю", если я или кто-то другой внесут изменения в код в будущем.
Вот несколько примеров тестов (псевдокод):
Тест 1:
- Create a new IntervalsArray
- Insert a new interval to the array
- (TEST) make sure the array has 1 object in it
Тест 2:
- Create a new IntervalsArray
- Insert 2 intervals into the array: [1-3] and [5-9]
- (TEST) make sure there are 2 items in the array
- (TEST) make sure interval [1-3] comes before interval [5-9]
В конце у меня было что-то вроде 15 тестов, чтобы охватить все аспекты моего нового массива.
Здесь хороший unit тест с учебником Xcode.
Вы также можете написать логические тесты (которые сложнее, чем модульные тесты), чтобы протестировать ваш пользовательский интерфейс. Прочитайте немного о UIAutomation, который является способом тестирования пользовательского интерфейса Apple. Это не идеально, но это довольно хорошо. Здесь отличный учебник об этом.
Если вы считаете себя хорошим программистом, вы должны написать модульные тесты для вашего кода.
Другие ответы говорят, когда, но не совсем так, так что дайте мне добавить ответ.
В любое время, когда вы пишете производственный код, который вы собираетесь сохранить, для этого вам необходимо иметь Unit Testing. Наиболее полезным обучением, которое я видел в этом, была следующая серия из 2 частей:
Первые пять минут или так просто вводятся, поэтому вы можете перейти к концу.
Я использую Xcode 7 со Swift.
Запустите новый проект и добавьте Unit Test.
Я называю мой MyProject
. Если вы откроете группу MyProjectTests в Навигаторе проектов, вы увидите, что Xcode уже создал файл Unit Test для вашего имени MyProjectTest.swift.
Теперь вы можете удалить все методы примера и добавить новый func
для проверки собственного метода класса. Не забудьте добавить строку @testable import MyProject
вверху. Если в названии вашего проекта есть пробелы, замените пробелы символами подчеркивания. (Например, "Мой примерный проект" использовал бы @testable import My_Example_Project
.)
Я следую шаблону именования testMethodNameBeingTested_Senario_ExpectedBehavior
. Unit Test имена должны начинаться с "test".
Я сделаю что-то вроде этого:
import XCTest
@testable import MyProject
class MyProjectTests: XCTestCase {
func testSum_TwoNumbers_ReturnsSum() {
// Arrange (set up the needed objects)
let myClass = MyClass()
// Act (run the method you want to test)
let sum = myClass.sum(1, 2)
// Assert (test that the behavior is as expected)
XCTAssertEqual(sum, 3)
}
}
Конечно, сборка завершилась неудачно, потому что мы еще не добавили класс MyClass
.
Добавьте свой класс.
Я добавляю файл Swift к MyProject
, называемому MyClass
.
class MyClass {
func sum(a: Int, _ b: Int) -> Int {
return a + b
}
}
Если бы я действительно следовал принципам TDD, я бы добавил только имя функции, а не возвращал правильное значение. Но для краткости я просто буду использовать весь метод.
Нажмите кнопку тестирования рядом с классом или методом тестового блока, чтобы снова запустить тест, и он должен пройти.
Чтобы увидеть, что это сбой (важная часть Unit Testing), вы можете сделать что-то вроде return 0
в методе sum
MyClass
. После запуска теста вы увидите следующее:
Вы можете вернуться и исправить это, а затем добавить больше тестов Unit. Вы также можете сделать другие Unit Test файлы для разных классов, если хотите. Просто щелкните правой кнопкой мыши группу MyProjectTest в Навигаторе проектов и выберите "Новый файл". Затем выберите "Класс тестового случая".
Записывайте модульные тесты в любое время, когда вы пишете код, который вам нужно будет поддерживать. То есть, если вы когда-либо захотите реорганизовать что-либо, изменив код, но сохранив поведение. Это почти каждый бит производственного кода.
Контрпример "Hello, World" не должен беспокоить код, который вы собираетесь выбросить. "Решение шипов" - это просто выяснить, как вы можете подойти к проблеме. Как только вы разобрались, выбросьте его и начните снова. Только на этот раз вы начинаете с тестов.
Вызов TDD "экстремист" делает звук явным и непрактичным. Фактически, как только вы изучаете TDD, это экономит время/деньги.
См. Пример тестирования устройства с помощью OCUnit для примера того, как работает TDD.
Каждый раз, когда вы пишете приложение, которое имеет классы, которые не являются вашими. Хорошее время для добавления модульных тестов для тестирования этих классов.
Все, кроме самых простых приложений, будут иметь свои собственные классы, поэтому почти всегда хорошая идея для unit test.
Если вы создаете библиотеки, которые будут использовать другие программисты или которые вы будете использовать в нескольких проектах, они всегда должны иметь модульные тесты.
Модульные тесты экономят много времени, когда меняются вещи, например, появляется новая версия ОС, гораздо лучше тестировать с помощью модульных тестов, а затем просто тестировать приложение.