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 распечатывает сообщение. Это сообщение перечисляет следующие данные:

  1. Первая линия запускается с Error in test представьте в виде строки и содержит имя и порядковый номер отдельного теста.

  2. Следующие три линии содержат вход, ожидаемый результат и результат, на самом деле наблюдаемый.

  3. Для каждой из опций 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.

Примеры

Пример 1

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

Пример 2

Тестовый файл должен содержать вызовы 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]

Пример 3

Большинство опций принято 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

Пример 4

Чтобы протестировать это, определенный вызов не занимает больше времени, чем конкретное количество секунд, использует опцию Timeout:

prog::test(prog::wait(5.0), null(), Timeout = 2)

Пример 5

В большинстве случаев фактическое и ожидаемый результат просто сравнены для равенства. Иногда, однако, это не желательно, специально для результатов с плавающей точкой:

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 = `~=`)

Пример 6

При реализации символьных алгоритмов часто существует несколько правильных и приемлемых ответов. В некоторых случаях получение любого определенного набора решений прекрасно. В этих случаях, с помощью 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

Параметры

stmt

Оператор MuPAD, чтобы протестировать

res

Выражение MuPAD или оператор, который определяет ожидаемый результат.

message

Сообщение (строка), который отображен, если тест перестал работать – видит опцию Message ниже

Опции

TrapError

Опция, заданная как TrapError = errnr

Ожидайте, что тест выдаст ошибку. errnr должно быть целое число, ожидаемое от вызова traperror(stmt) или список целого числа и строки, как возвращено getlasterror().

Method

Опция, заданная как Method = comp

Метод раньше сравнивал фактическое и ожидаемый результат. Будет вызван обоими выражениями и должен возвратить TRUE или FALSE.

Timeout

Опция, заданная как Timeout = sec

Тайм-аут для оценки тестов. И фактическое и ожидаемый результат оценены с этим ограничением по времени. Если расчет занимает слишком много времени, prog::test ведет себя, как будто команда привела к ошибке из-за тайм-аута (код ошибки 1320).

Message

Опция, заданная как Message = message или Message(res1) = message

Добавьте сообщение (строка) к выходу prog::test. Если res1 дан, сообщение дано если результат оценки stmt res1.

Baseline

Отметьте этот тест как переставший работать в своего рода “базовой линии”, чтобы дифференцировать новые ошибки (происхождение от новых разработок кода, отказов регрессии) от ошибок, уже существующих в некоторой определенной более ранней версии. Это влияет на выход prog::test.

Enhancement

Опция, заданная как Enhancement = res1

Запросите некоторый другой выход, чем тот, в настоящее время протестированный на. Семантически, вызов формы prog::test(inp, out, Enhancement = out2) означает “проверку что вызов inp результаты в том же самом как вызов out, но обратите внимание, что мы на самом деле предпочли бы видеть out2.”

ExpectedWarnings

Опция, заданная как ExpectedWarnings = list

Дает список предупреждений, которые вызов должен испустить как строки. Испускание этих предупреждений или дополнительных единиц, рассматривается ошибкой.

High, Low, Medium, Priority

Опция, заданная как Priority = Low | Medium | High

Обозначьте важность этого теста. Это обычно будет очень субъективным вопросом и влияет на выход prog::test только, чтобы позволить инструменты, анализирующие выход, отображающий проблемы более высокого приоритета более заметно.

Developers

Опция, заданная как Developers = devnames

Строка включена в выход prog::test, обозначение разработчиков, которых считают ответственными за код, протестировано. Это предназначается для инструментов последующей обработки.

BugId

Опция, заданная как BugId = bugid

Снова, для выхода prog::test, включайте ссылку на некоторую систему отслеживания ошибок. bugid может быть любой объект MuPAD.

Возвращаемые значения

prog::test возвращает пустой объект null().

Смотрите также

Функции MuPAD