Я новичок в модульном тестировании и столкнулся с проблемой. Мое приложение читает файл с большим количеством фреймов данных, и тесты должны проверить, как моя программа справляется с ними. При чтении этих кадров могут возникать различные виды ошибок, которые могут возникнуть в любом месте файла. Чтение всего файла может занять 2 секунды, а количество тестов может стать огромным.
Это означает, что считывание файла только один раз и проверка его на наличие ошибок за один прогон будет наиболее эффективным способом. Однако это противоречит общему тестовому шаблону, который я рекомендую везде. Обычный тестовый шаблон рекомендует иметь 1 тестовый метод на тест, но это будет означать, что если я хочу протестировать 10 вещей, мне нужно прочитать весь файл 10 раз. Особенно, когда они получают все больше и больше, это будет очень неэффективно. Ярлыки невозможны, все эти тесты требуют чтения всего файла.
Я знаю типы ошибок, которые могут возникнуть, я просто не знаю, где и если они есть до начала теста.
Мое текущее "грязное" решение - добавить все ошибки в список и вывести этот список позже с помощью assert.fail, но я несколько раз читал, что это действительно очень грязное решение.
Одна идея, которая у меня возникла, заключалась в том, что один поток читает файл и «передает» все методы тестирования со следующей записью и ждет их, пока не продолжится. Однако я не верю, что это можно осуществить.
Есть идеи, как сделать это чисто и эффективно? Или мне просто взять чит и добавить их все в список, как я делаю сейчас? Большинство целых rnet примеров - слишком много идеальных примеров из мира, и трудно найти решения для подобных вещей.
Редактировать: я знаю, что можно выполнять тесты в параллельном режиме, но это не задержит неизбежная bottle шея?
Edit2:
Это конструкция кода.
private List<TestError> errors;
private Session session;
private MemoryStream mStr;
private void Init()
{
errors = new List<TestError>();
session = new Session();
var test = NUnit.Framework.TestContext.CurrentContext.Test;
mStr = new MemoryStream(File.ReadAllBytes(TestContext.CurrentContext.TestDirectory + "\\Files\\" + test.ClassName.Split('.')[2] + "_" + test.MethodName + ".bin"));
session.StartRawDataRecording(mStr,
true, true);
}
[Test]
public async Task Test1()
{
Init();
var recorder = session.Recorder as RawDataRecorder;
while (!recorder.IsCancelled)
{
await recorder.ManualLoopTick();
if({condition1})
errors.Add(new TestError("condition1", "condition1 occured"));
if({condition2})
errors.Add(new TestError("condition2", "condition2 occured"));
}
if(errors.Count > 0)
{
StringBuilder b = new StringBuilder();
b.AppendLine("Run Errors:");
for (int i = 0; i < errors.Count;++i)
{
var err = errors[i];
b.AppendLine(String.Format("Error: {0}, Message: {1}",err.Error,err.Message));
b.AppendLine("Stacktrace: " + err.StackTrace);
b.AppendLine();
}
Assert.Fail(b.ToString());
}