Как делают меня персистентность модульного теста?

Если ваш проект CLI (Common Language Runtime Support), то:

Вы можете использовать класс массива, а не тот, который вы получаете при написании:

#include <array>
using namespace std;

Другими словами, не неуправляемый класс массива, который вы получаете при использовании пространства имен std и при включении заголовка массива, а не неуправляемого класса массива, определенного в пространстве имен std и в заголовке массива, а в массиве управляемого класса CLI.

с этим классом, вы можете создать массив любого ранга, который вы хотите.

Следующий код ниже создает новый двухмерный массив из 2 строк и 3 столбца и типа int, и я называю it "arr":

array<int, 2>^ arr = gcnew array<int, 2>(2, 3);

Теперь вы можете получить доступ к элементам в массиве, по имени и написать только квадратные скобки [], а внутри них добавить строку и столбец и отделить их с запятой ,.

Следующий код ниже относится к элементу во второй строке и первом столбце массива, который я уже создал в предыдущем коде выше:

arr[0, 1]

только для записи эта строка должна прочитать значение в этой ячейке, т. е. получить значение в этой ячейке, но если вы добавите знак =, вы собираетесь записать значение в этой ячейке, то есть установить значение в этой ячейке. Вы также можете использовать операторы + =, - =, * = и / =, только для чисел (int, float, double, __int16, __int32, __int64 и т. Д.), Но вы уже знаете это.

Если ваш проект не CLI, вы можете использовать неуправляемый класс массива пространства имен std, если вы #include <array>, конечно, но проблема в том, что этот класс массива отличается от массива CLI. Создать массив такого типа аналогичен CLI, за исключением того, что вам придется удалить знак ^ и gcnew. Но, к сожалению, второй параметр int в скобках <> указывает длину (т. Е. Размер) массива, а не его ранг!

Невозможно указать ранг в этом типе массива, ранг - это CLI массив.

std array ведет себя как обычный массив в c ++, который вы определяете с помощью указателя, например int*, а затем: new int[size] или без указателя: int arr[size], но в отличие от Обычный массив c ++, std array предоставляет функции, которые вы можете использовать с элементами массива, такие как fill, begin, end, size и т. д., но обычный массив ничего не предоставляет.

Но все же std-массив являются одномерными массивами, такими как обычные c ++-массивы. Но благодаря решениям, которые другие ребята предлагают о том, как вы можете превратить обычный двумерный массив c ++ в двумерный массив, мы можем адаптировать те же идеи к std-массиву, например. в соответствии с идеей Мехрдада Афшари, мы можем написать следующий код:

array<array<int, 3>, 2> array2d = array<array<int, 3>, 2>();

Эта строка кода создает «жуткий массив», который является одномерным массивом, который каждая из его ячеек является или указывает на другой одномерный массив.

Если все одномерные массивы в одномерном массиве равны по длине / размеру, то вы можете рассматривать переменную array2d как реальный двумерный массив, плюс вы можете использовать специальные методы для обрабатывать строки или столбцы, зависит от того, как вы это рассматриваете, в 2D-массиве, который поддерживает std-массив.

Вы также можете использовать решение Кевина Лони:

int *ary = new int[sizeX*sizeY];

// ary[i][j] is then rewritten as
ary[i*sizeY+j]

, но если вы используете std-массив, код должен выглядеть по-другому:

array<int, sizeX*sizeY> ary = array<int, sizeX*sizeY>();
ary.at(i*sizeY+j);

И все еще имеют уникальные функции массива std.

Обратите внимание, что вы по-прежнему можете получить доступ к элементам std с помощью [] круглых скобок, и вам не нужно вызывать функцию at. Вы также можете определить и присвоить новую переменную int, которая будет вычислять и сохранять общее количество элементов в std-массиве и использовать его значение вместо повторения sizeX*sizeY

. Вы можете определить свой собственный двухмерный массив generic class и определить конструктор класса двумерных массивов для получения двух целых чисел, чтобы указать количество строк и столбцов в новом двухмерном массиве и определить функцию get, которая получает два параметра целого числа, которые обращаются к элементу в двумерном массив и возвращает его значение, и задайте функцию, которая получает три параметра, две первые являются целыми числами, которые определяют строку и столбец в двумерном массиве, а третий параметр - новое значение элемента. Его тип зависит от типа, который вы выбрали в родовом классе.

Вы сможете реализовать все это, используя либо обычный массив c ++ (указатели или без), либо массив std и используйте одну из идей что другие люди предложили и упростили использование, как массив cli, или как двухмерный массив, который вы можете определить, назначить и использовать в C #.

46
задан Lukas Eder 14 August 2012 в 14:05
поделиться

9 ответов

Изучите Единицу DB. Это - библиотека Java, но должен быть эквивалент C#. Это позволяет Вам подготовить базу данных с рядом данных так, чтобы Вы знали то, что находится в базе данных, тогда можно взаимодействовать через интерфейс с Единицей DB для наблюдения то, что находится в базе данных. Это может работать против многих систем баз данных, таким образом, можно использовать фактическую установку базы данных или использовать что-то еще, как HSQL в Java (реализация базы данных Java с в параметре памяти).

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

18
ответ дан Mike Stone 26 November 2019 в 20:40
поделиться

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

DbUnit (Java)

DbUnit.NET

16
ответ дан Community 26 November 2019 в 20:40
поделиться

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

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

4
ответ дан Rytmis 26 November 2019 в 20:40
поделиться

Я записал сообщение здесь относительно поблочное тестирование уровень данных, который покрывает эту точную проблему. Извинения за (позорный) разъем, но статья является слишком длинным для регистрации здесь.

я надеюсь, что это помогает Вам - это работало очень хорошо на меня за прошлые 6 месяцев на 3 активных проектах.

С уважением,

Грабят G

3
ответ дан OJ. 26 November 2019 в 20:40
поделиться

Проблема, которую я испытал, когда персистентность поблочного тестирования, особенно без ORM и таким образом насмешки Вашей базы данных (соединение), состоит в том, что Вы действительно не знаете, успешно выполняются ли Ваши запросы. Могло случиться так, что Вы, Ваши запросы специально предназначены для конкретной версии базы данных и только успешно выполняются с той версией. Вы никогда не будете узнавать это при насмешке базы данных. Так, по-моему, персистентность поблочного тестирования только имеет ограниченное применение. Необходимо всегда добавлять тесты, работающие против целенаправленной базы данных.

2
ответ дан dlinsin 26 November 2019 в 20:40
поделиться

Для NHibernate, я определенно рекомендовал бы просто дразнить NHibernate API для модульных тестов - доверяют библиотеке, чтобы сделать правильную вещь. Если Вы хотите удостовериться, что данные на самом деле переходят к DB, сделайте интеграционный тест.

2
ответ дан N00b Pr0grammer 26 November 2019 в 20:40
поделиться

Я также дразнил бы базу данных и проверил бы, что запросы - то, что Вы ожидали. Существует риск, что тест проверяет несправедливость sql, но это было бы обнаружено в интеграционных тестах

1
ответ дан David Sykes 26 November 2019 в 20:40
поделиться

Технически модульными тестами постоянства не являются Модульные тесты, они - Интеграционные тесты.

С C# с помощью mbUnit, Вы просто используете атрибуты SqlRestoreInfo и RollBack

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

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

Что касается проверки, если Ваш запрос был succeful, обычно необходимо следовать за ним со вторым запросом, чтобы видеть, была ли база данных изменена, как Вы ожидаете.

1
ответ дан Dan 26 November 2019 в 20:40
поделиться

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

1
ответ дан Thomas Eyde 26 November 2019 в 20:40
поделиться
Другие вопросы по тегам:

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