Как сделать Поблочное тестирование с Неуверенностью?

Найдите ваш экземпляр mysql с помощью:

which mysql

Если это правильно, то экспортируйте с помощью следующего (иначе перейдите к экземпляру mysql в папке mamp в bin):

mysqldump -u [username] -p [password] [dbname] > filename.sql

И если вы хотите закрепить его в момент времени:

mysqldump -u [username] -p [password] [db] | gzip > filename.sql.gz

Затем вы можете переместить этот файл между серверами с помощью:

scp user@xxx.xxx.xxx.xxx:/path_to_your_dump/filename.sql.gz your_detination_path/

(где xxx.xxx. xxx.xxx - это IP-адрес сервера)

И затем импортируйте его с помощью:

gunzip filename.sql.gz | mysql -u [user] -p [password] [database]
16
задан martinus 14 January 2009 в 14:45
поделиться

7 ответов

Это кажется, что Вашему оптимизатору нужны два вида тестирования:

  1. тестирование полной эффективности алгоритма
  2. тестирование целостности Вашей реализации алгоритма

Начиная с алгоритма включает рандомизацию, (1) является трудным к модульному тесту. Любой тест вероятностного процесса приведет некоторую пропорцию к сбою времени. Необходимо знать, что некоторая статистика понимает, как часто она должна перестать работать. Существуют способы обменять между тем, насколько строгий Ваш тест и как часто он перестал работать.

, Но существуют способы записать модульные тесты на (2). Например, Вы могли сбросить семя к конкретному значению прежде, чем выполнить Ваши модульные тесты. Тогда вывод детерминирован. Это не позволило бы Вам оценивать среднюю эффективность алгоритма, но это для (1). Такой тест служил бы натяжной проволокой: если бы кто-то ввел ошибку в код во время обслуживания, детерминированный модульный тест мог бы поймать ошибку.

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

Обновление : Я записал главу об этой проблеме в книге Красивое Тестирование. См. Главу 10: Тестирование Генератора случайных чисел .

15
ответ дан 30 November 2019 в 16:50
поделиться

Модульный тест никогда не должен иметь неизвестного состояния передачи/сбоя. Если Ваш алгоритм возвращает различные значения, когда выполнено с теми же исходными данными многократно, Вы, вероятно, делаете что-то странное в своем алгоритме.

я взял бы каждый из 5 алгоритмов оптимизации и протестировал бы их, чтобы удостовериться, что данный ряд исходных данных x, Вы возвращаете оптимизированное значение y каждый раз.

РЕДАКТИРОВАНИЕ : Для обращения к случайным компонентам системы можно или представить способность передать в семени для генератора случайных чисел, который будет использоваться, или можно использовать библиотеку насмешки (крыло RhinoMocks), чтобы вынудить его использовать конкретное число, когда RNG просят относительно случайного числа.

7
ответ дан 30 November 2019 в 16:50
поделиться

Ваши алгоритмы, вероятно, имеют случайный компонент. Подчините контролю его.

Вы можете любой

  1. , Позволяют вызывающей стороне выбирать семя для генератора случайных чисел. Тогда используйте семя hardcoded в тестах.
  2. Сделали, чтобы вызывающая сторона обеспечила генератор случайных чисел. Тогда используйте поддельный генератор случайных чисел в тестах.

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

, Когда алгоритмы поблочного тестирования, что Вы хотите проверить, то, что Вы правильно реализовали алгоритм. Не, делает ли алгоритм то, что он, как предполагается, делает. Модульные тесты не должны рассматривать код под тестом как черный квадрат.

можно хотеть иметь отдельную "производительность" - тест, чтобы выдержать сравнение, как различные алгоритмы работают (и работают ли они на самом деле), но модульные тесты действительно для тестирования Вашего реализация из алгоритма.

, Например, при реализации Foo-Bar-Baz Optimization Algorithm (TM) Вы, возможно, случайно записали x: = x/2 вместо x: = x/3. Это могло бы означать, что алгоритм работает медленнее, но все еще находит тот же алгоритм. Вам будет нужно тестирование методом "белого ящика" для нахождения такой ошибки.

Редактирование:

, К сожалению, я не могу выбрать фиксированное семя для генератора случайных чисел, потому что я не хочу тестировать, если алгоритм приводит к тому же самому результату как прежде, но я хочу протестировать что-то как "С 90%-й уверенностью, я получаю результат с 0,1 или лучше".

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

, Если бы Вы хотите протестировать "С 90%-й уверенностью, я получаю результат с 0,1 или лучше", я предложил бы что-то как:

double expectedResult = ...;
double resultMargin = 0.1;
int successes = 0;
for(int i=0;i<100;i++){
  int randomSeed = i;
  double result = optimizer.Optimize(randomSeed);
  if(Math.Abs(result, expectedResult)<resultMargin)
    successes++; 
}
Assert.GreaterThan(90, successes);

(Отмечают, что этот тест детерминирован).

7
ответ дан 30 November 2019 в 16:50
поделиться

Позвольте тестовому прогону, и если какой-либо из них приводит к сбою, повторно выполняет просто те тесты 50 раз и видит, какую пропорцию времени они приводят к сбою. (Автоматизированным способом, конечно.)

5
ответ дан 30 November 2019 в 16:50
поделиться

Я предложил бы, чтобы, вместо того, чтобы иметь Ваш тест выполненный против кода, производящего распределение Гаусса, Вы создали алгоритм типа Монте-Карло, который выполняет Метод много раз, и затем тестируют полное распределение результатов использование соответствующей модели распределения. Если это будет среднее число, например, то Вы будете быть в состоянии протестировать против твердого порога. Если это будет более сложно, необходимо будет создать код, который моделирует соответствующее распределение (например, сделайте значения < x составляют y % моих результатов).

Имеют в виду, что Вы не тестируете генератор чисел, Вы тестируете Единицу, которая генерирует значения!

1
ответ дан 30 November 2019 в 16:50
поделиться

Спасибо за все ответы я теперь делаю это:

  1. Запущенный тест 5 раз и берут средний результат.
  2. , Если средний результат ниже определенного порога, тест успешно выполняется.
  3. , Если порог перестал работать, тест снова до любого, порог встречен (тест успешно выполняется), ИЛИ пока я не сделал столько повторений (приблизительно приблизительно 100), что я могу быть вполне уверен, который медиана больше не получает ниже порога.

Этот путь каждый раз, когда тест похож на него, собирается перестать работать, это повторно вычисляется так часто, пока это не вполне уверено, что это действительно перестало работать.

Это, кажется, работает, но я не совсем удовлетворен, потому что я только тестирую средний результат.

1
ответ дан 30 November 2019 в 16:50
поделиться

И jUnit и NUnit могут утверждать типы данных с плавающей точкой со значением допуска/дельты. Т.е. Вы тестируете, если вывод является правильным значением плюс-минус некоторое десятичное число. В Вашем случае правильное значение, которое Вы хотите проверить, 0 с допуском 0.5, если Вы хотите, чтобы все значения в данном выводе передали (или 0.20 с допуском +/-0.20).

из-за случайной природы Ваших результатов, можно хотеть к частям модульного теста алгоритма удостовериться, что это действительно делает то, что это, как предполагается.

0
ответ дан 30 November 2019 в 16:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: