Я пишу набор тестов на основе классов в MATLAB для пакета обработки временных рядов.Первый тест в моем наборе должен проверить, существует ли соединение с базой данных Haver на сетевом диске.Если соединение не существует, то первый тест должен прервать оставшуюся часть пакета, используя один из методов fatalAssert
.
Один усложняющий фактор, который я исключил из описания ниже, но я упомянуТеперь мне нужно использовать анонимную функцию, чтобы проверить соединение с Haver (если у кого-то нет идеи получше).Мой пакет обрабатывает данные из нескольких источников, а Haver только один из них.
У меня есть набор тестов родительского класса, который выполняет общие тесты для всех источников.Затем я наследую этот родительский класс в определенные наборы тестов дочернего класса и устанавливаю конкретные параметры в их соответствующем методе TestMethodSetup
.Одним из этих параметров является анонимная функция connfun
и местоположение connloc
, которые я использую в родительском классе для проверки соединения.Причина, по которой я это делаю, заключается в том, что родительские тесты выполняются первыми, поэтому мне придется ждать завершения всех из них, если я хочу проверить соединение в дочернем классе.
Это также усложняет порядоквыполнение.Если я хочу присвоить connfun
в дочернем классе, тогда я должен использовать либо TestMethodSetup
, либо TestClassSetup
дочернего класса (открытый для рекомендаций, по которым лучше здесь), и поместить этот тест соединения в Test
метод родительского класса.Я заметил, что если бы я поместил checkConn
в TestMethodSetup
и TestClassSetup
родительского класса, который выполнялся до дочернего класса, я не смог бы пройти анонимную функцию, и тест был бы неполным.
Отложив предыдущую точку на мгновение, это была моя первая попытка написания теста в родительском классе (обратите внимание, что я использовал fatalAssertEqual
вместо fatalAssertTrue
, потому что isconnection()
не возвращает логическое значение):
methods (Test)
function checkConn(testCase)
connloc = 'pathToHaverDatabase';
connfun = @(x) isconnection(haver(x));
testCase.fatalAssertEqual(connfun(connloc), 1);
end
end
Вышеописанное работает при наличии соединения, но проблема, с которой я столкнулся, заключается в том, что, когда я не могу получить доступ к connloc
, возникает ошибка во время вызова haver()
.Таким образом, вместо возврата 1 или 0 из isconnection()
вызова, который я могу включить fatalAssertEqual
, все checkConn
ошибки из-за haver()
.Это приводит к тому, что остальные тесты выполняются (и терпят неудачу, и это именно то, чего я хочу избежать).
Моя следующая идея работает в обоих случаях, но она чувствует как плохой коди не не имеет спецификации анонимной функции, описанной выше.
methods (Test)
function checkConn(testCase)
connloc = 'pathToHaverDatabase';
connfun = @(x) isconnection(haver(x));
try
isconn = connfun(connloc);
catch
isconn = 0;
end
testCase.fatalAssertEqual(isconn, 1)
end
end
Когда я писал это, я не обязательно хотел различать отсутствие доступа к сетевому диску, невозможность вызова функции haver()
и получение isconnection
равным 0потому что последний случай охватывает все три.Но я понял, что если бы я их дифференцировал, то это было бы немного более надежно, но в нем по-прежнему отсутствовала анонимная функция, которую я мог бы передать от ребенка к родителю.fatalAssert
метод (или что-то подобное), который завершает набор тестов, когда его ввод является ошибкой.Что-то, что можно было бы назвать fatalAssertNotError
, но я не думаю, что это существует.Если бы это было так, последняя строка моей первой функции была бы просто testCase.fatalAssertNotError(connfun(connloc))
, и мне не пришлось бы беспокоиться обо всех случаях.
Я очень открыт для динамического переписывания всей этой настройки теста, поэтомулюбые конкретные комментарии или общие советы приветствуются!