Чтение нескольких тестов NUnit в длинном потоке - PullRequest
0 голосов
/ 15 апреля 2020

Я новичок в модульном тестировании и столкнулся с проблемой. Мое приложение читает файл с большим количеством фреймов данных, и тесты должны проверить, как моя программа справляется с ними. При чтении этих кадров могут возникать различные виды ошибок, которые могут возникнуть в любом месте файла. Чтение всего файла может занять 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());
        }
...