prog
:: test
Автоматическое сравнение результатов вычисления
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
prog::test(stmt
,res | TrapError = errnr
, <Timeout = sec
>, <message
>,options
) prog::test(stmt
)
prog::test
работает в двух различных режимах: интерактивный и в тестовых файлах.
В интерактивном режиме один вызов prog::test
может использоваться, чтобы сравнить два оператора MuPAD®.
Вызов prog::test(stmt, res)
оценивает оба аргумента stmt
и res
. Когда оценка приводит к точно тому же объекту MuPAD, и никакой Enhancement
не требовали, ничто не распечатано, и prog::test
возвращает пустой объект null()
.
Если результаты отличаются, тестовые сбои и сообщение распечатан.
Дополнительные аргументы описаны в следующей части для использования prog::test
в тестовых файлах.
Другой режим использует prog::test
в тестовых файлах. Тестовый файл должен запуститься с prog::testinit
. Эта функция инициализирует тестовый файл. Затем можно записать несколько тестов с помощью prog::test
. Последним оператором в тестовом файле должен быть prog::testexit()
. Также можно задать имя протестированной процедуры при помощи print(Unquoted, "testname")
после prog::testinit
. Это имя не влияет на саму протестированную процедуру. Это только появляется в протоколах испытаний, сгенерированных вашим тестовым скриптом.
Тесты могут быть произвольными операторами MuPAD и операторами prog::test
. Однако большая часть функциональности должна быть выполнена в качестве аргумента prog::test
. Только инициализация переменных должна быть выполнена за пределами операторов prog::test
в тестовом файле, потому что prog::test
захватывает каждую ошибку (с функциональным traperror
) и распечатывает определенное сообщение об ошибке.
Если ошибка происходит за пределами prog::test
, чтение тестового файла прервано.
Если никакая ошибка не происходит (как должен быть случай по умолчанию), результаты сравнены, и сообщение распечатано, если они отличаются.
Синхронизация информации может быть собрана и выдержала сравнение, которые рассматривают только время оценки первого аргумента stmt
prog::test
(см. prog::testinit
).
Если тест приводит к сбою, например, два первых аргумента вывода prog::test
к различным объектам MuPAD, или если запрос улучшения был дан, prog::test
распечатывает сообщение. Это сообщение перечисляет следующие данные:
Первая строка запускается со строки Error in test
и содержит имя и порядковый номер отдельного теста.
Следующие три строки содержат вход, ожидаемый результат и результат, на самом деле наблюдаемый.
Для каждой из опций Priority
, Enhancement
, Message
, Developers
и BugId
, если опция была установлена, будет распечатана соответствующая строка. Обратите внимание на то, что Message
может быть установлен путем простого обеспечения строки сообщения.
Эта информация сопровождается пустой пустой строкой.
Если только один аргумент дан, аргумент оценен и по сравнению с TRUE
, т.е. prog::test(ex)
эквивалентен prog::test(ex, TRUE)
.
Когда тест инициализируется с prog::testinit
и заканчивается prog::testexit
, короткое сообщение распечатано со следующим форматом:
Info: 20 test, 1 error, runtime factor 1.7 (expected 2.0)
Сообщение содержит количество всех тестов, выполняемых (20
), количество ошибок (1
), и в два раза факторы: В первый раз фактор на основе фактического времени теста, и фактором второго раза является ожидаемое значение, данное prog::testinit
.
prog::test
может быть назван в интерактивном режиме:
prog::test(1 + 1, 2): prog::test(is(2 > 1)): prog::test(sin(PI), 0, "check sin"):
Эти тесты проверяются хорошо. В следующих тестах неправильные результаты тестируются против, чтобы продемонстрировать сообщения, данные prog::test
:
prog::test(1 + 2, 2):
Error in test 4
Input: 1 + 2
Expected: 2
Got: 3
Near line: 1
prog::test(is(x > 1)):
Error in test 5
Input: is(1 < x)
Expected: TRUE
Got: UNKNOWN
Near line: 1
prog::test(sin(PI), PI, "check sin"):
Error in test 6
Input: sin(PI)
Expected: PI
Got: 0
Message: check sin
Near line: 1
Тестовый файл должен содержать вызовы prog::testinit
и prog::testexit
. В следующем файле мы тестируем функцию, определяемую в том же файле, который является довольно редким, очевидно.
// test file "test.tst" test:= (a, b) -> a^2 + 2*b^2 - a*b: prog::testinit("test", 0.1): print(Unquoted, "testname"): prog::test(test(1, 4), 29, Message = "my first example"): prog::test(test(3, -2), 24, "the second example"): prog::test(error("test"), TrapError = 1028): prog::testexit():
Первый оператор является только комментарием. Вторая строка содержит инициализацию процедуры тестирования под названием test
. Затем тест инициализируется с prog::testinit
.
После этого три теста выполняются: первый тест является правильным, второй ожидаемый результат является неправильным, и третий тест производит ошибку, но ожидаемый результат является этой ошибкой, кодом ошибки, возвращенным traperror
, является 1028
(пользовательский вызов error
).
Целый тест не занимает почти времени:
read("test.tst")
Info: memory limit is 256 MB
Error in test 2
Input: test(3, -2)
Expected: 24
Got: 23
Message: the second example
Near line: 4
Info: time used outside of 'prog::test' takes 100%
Info: 3 tests, 1 error, runtime factor 0.0 (expected 0.1)
Info: CPU time: 1.1 s
Info: Memory allocation 9026800 bytes [prog::testexit]
Большинство опций, принятых prog::test
, более или менее непосредственно помещается в вывод:
prog::test(1+1, 1, Baseline, Message(2)="well ...", Priority=Low, BugId="123-456")
Baseline Error in test 7
Input: 1 + 1
Expected: 1
Got: 2
Priority: Low
Message: well ...
BugId: 123-456
Near line: 2
Чтобы протестировать это, определенный вызов не занимает больше времени, чем конкретное количество секунд, использует опцию Timeout
:
prog::test(prog::wait(5.0), null(), Timeout = 2)
В большинстве случаев фактическое и ожидаемый результат просто сравнены для равенства. Иногда, однако, это не желательно, специально для результатов с плавающей точкой:
prog::test(float(PI), 3.1415926535897932385)
Error in test 8
Input: float(PI)
Expected: 3.141592654
Got: 3.141592654
Near line: 1
Проблема здесь состоит в том, что существует много значений с плавающей точкой, которые не идентичны, все же отображены как таковые (если вы не увеличиваете DIGITS
достаточно далеко, чтобы видеть различие). Используя опцию Method
, можно обеспечить функцию, чтобы сравнить значения:
prog::test(float(PI), 3.1415926535897932385, Method = `~=`)
При реализации символьных алгоритмов часто существует несколько правильных и приемлемых ответов. В некоторых случаях получение любого определенного набора решений прекрасно. В этих случаях, с помощью Method = _in
разумный способ записать тесты (_in
является функциональной формой оператора in
):
prog::test(int(ln(ln(a*x)^(1/2)), x), { x*ln(ln(a*x)^(1/2)) - Li(a*x)/(2*a), x*ln(ln(a*x))/2 - Li(a*x)/(2*a) }, Method = _in, Timeout = 20)
Иногда, однако, в то время как несколько результатов приемлемы, вы на самом деле предназначаетесь для одного конкретного вывода. Для этих случаев можно использовать Enhancement
, чтобы установить золотую цель:
prog::test((x^2+2*x+1)/(x+1), (x^2+2*x+1)/(x+1), Enhancement = x+1)
Enhancement request: 11
Input: (x^2 + 2*x + 1)/(x + 1)
Got: (x^2 + 2*x + 1)/(x + 1)
Requested: x + 1
Near line: 3
Если запрос улучшения когда-нибудь обрабатывается, выходные изменения:
prog::test(normal((x^2+2*x+1)/(x+1)), (x^2+2*x+1)/(x+1), Enhancement = x+1)
Enhancement done: 12
Input: normal((x^2 + 2*x + 1)/(x + 1))
Got: x + 1
Requested: x + 1
Near line: 3
Обратите внимание на то, что тест с запросом улучшения является, прежде всего, все еще обычным тестом и ведет себя как таковой:
prog::test((x^2+x+1)/(x+1), (x^2+2*x+1)/(x+1), Enhancement = x+1)
Error in test 13
Input: (x^2 + x + 1)/(x + 1)
Expected: (x^2 + 2*x + 1)/(x + 1)
Got: (x^2 + x + 1)/(x + 1)
Near line: 3
|
Оператор MuPAD, чтобы протестировать |
|
Выражение MuPAD или оператор, который определяет ожидаемый результат. |
|
Сообщение (строка), который отображен, если тест перестал работать – видит опцию |
|
Опция, заданная как Ожидайте, что тест выдаст ошибку. |
|
Опция, заданная как Метод раньше сравнивал фактическое и ожидаемый результат. Будет вызван обоими выражениями и должен возвратить |
|
Опция, заданная как Тайм-аут для оценки тестов. И фактическое и ожидаемый результат оценены с этим ограничением по времени. Если вычисление занимает слишком много времени, |
|
Опция, заданная как Добавьте сообщение (строка) к выводу |
|
Отметьте этот тест как переставший работать в своего рода “базовой линии”, чтобы дифференцировать новые ошибки (происхождение от новых разработок кода, отказов регрессии) от ошибок, уже существующих в некоторой определенной более ранней версии. Это влияет на вывод |
|
Опция, заданная как Запросите некоторый другой вывод, чем тот, в настоящее время протестированный на. Семантически, вызов формы средние значения |
|
Опция, заданная как Дает список предупреждений, которые вызов должен испустить как строки. Испускание этих предупреждений или дополнительных единиц, рассматривается ошибкой. |
|
Опция, заданная как Обозначьте важность этого теста. Это обычно будет очень субъективным вопросом и влияет на вывод |
|
Опция, заданная как Протестирована строка, включенная в вывод |
|
Опция, заданная как Снова, для вывода |
prog::test
возвращает пустой объект null()
.