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
сообщение
, 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()
.