Ограничение по времени
TimeLimitTrait — тип данных, ограничивающий время выполнения теста:
Тайм-ауты тестов не поддерживают высокую точность и слишком короткие промежутки из-за вариативности в тестовой среде. Говоря о слишком коротких промежутках, я имею ввиду секунды, милисекунды, микро и наносекунды. Ограничение времени должно быть выражено только в целых минутах и составлять не менее 1 минуты.
Использование
Для применения этого трейта вызовите метод timeLimit
в макросе @Test
или @Suite
:
@Suite("Трейт TimeLimit", .timeLimit(.minutes(0)))
struct TimeLimitExample {
@Test
func takeYourTime() {
#expect(60.0 == 60.0)
}
@Test(.timeLimit(.minutes(1)))
func anotherDay() {
#expect(0.3 == 0.3)
}
}
Наследование времени просходит от родительского @Suite
.
Если макрос @Test
или @Suit
принимают более 2 трейтов с ограничением времени, то за максимальное время выполнения будет взято наменьшее значение.
В примере с TimeLimitExample
наименьшее время выполнения 0 минут, поэтому тест завершается неудачей.
❌ Time limit was exceeded: 0.000 seconds
Попробуйте запустить тест ниже:
@Test(
"Максимальное время timeLimit",
.timeLimit(.minutes(1)),
.timeLimit(.minutes(5))
)
func maxTimeLimit() async throws {
try await Task.sleep(for: .seconds(120))
#expect(true)
}
Когда тест или suite не успевают выполнится в установленное время, вызывается ошибка из трейта Issue.Kind.timeLimitExceeded(timeLimitComponents:)
. В таком случае тест завершается неудачей.
❌ Time limit was exceeded: 60.000 seconds
Расширение
@available(_clockAPI, *)
public struct TimeLimitTrait: TestTrait, SuiteTrait {...}
@available(_clockAPI, *)
extension Trait where Self == TimeLimitTrait {
@_spi(Experimental)
public static func timeLimit(_ timeLimit: Duration) -> Self {
return Self(timeLimit: timeLimit)
}
}