Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Unit тесты в VS2008


Автор: Экскалупатор 3.7.2010, 17:45
всем привет. подскажите кто знает толковое руководство по написанию тестов в VS2008. нужна не теория, а именно описание что для чего и как писать, желательно с примерами на вроде:
"имеем такой класс/метод для того что бы его протестировать пишем следующий код, вот так передаем параметры, вот так получаем ответы..." т.е. для "чайников", так сказать с нуля...
заранее спасибо.

Автор: Exai1e 3.7.2010, 18:10
Экскалупатор, например
http://habrahabr.ru/blogs/net/98062/
а вообще в гугле, довольно много инфы, как создавать тесты в студии и т.д.

Автор: Экскалупатор 3.7.2010, 18:56
Exai1e, спасибо, буду читать.
в гугле я всегда ищу в первую очередь, но не всегда получается найти.

Автор: Экскалупатор 4.7.2010, 00:26
почитал по ссылке выше, вроде все понятно, но не понятным остался следующий вопрос: можно ли каким то образом создать коллекцию входных и выходных параметров, но так что бы при не выполнении теста было видно какой именно набор выдал неверный результат. 
я для примера сделал такой метод:
Код

public double Calculate(int a, int b)
        {
            return a / b;
        }


и тест к нему:
Код

public void CalculateTest()
        {
            Program target = new Program();
            for (int i = 0; i < 10; ++i)
            {
                for (int j = 0; j < 10; ++j)
                {
                    int a = i; // TODO: Initialize to an appropriate value
                    int b = j; // TODO: Initialize to an appropriate value
                    double expected = i/j; // TODO: Initialize to an appropriate value
                    double actual;
                    actual = target.Calculate(a, b);
                    Assert.AreEqual(expected, actual);
                }
            }
        }

естественно что я получаю ошибку деления на ноль, при чем ошибка получается в самом тесте а не в тестируемом методе. вопрос как написать тест, что бы можно было проверить те же наборы входных параметров. единственный вариант который у меня придумывается это просто писать все варианты по очереди, к примеру:
Код

public void CalculateTest()
        {
            Program target = new Program();

                    Assert.AreEqual(1, target.Calculate(1, 1));
                    Assert.AreEqual(1, target.Calculate(2, 2));
                    Assert.AreEqual(0, target.Calculate(0, 1));
                    Assert.AreEqual(0, target.Calculate(1, 0));
.....еще много этих строчек.....
        }

но такой вариант мне кажется крайне неудобным, не ужели нету чего то более удобного?

Автор: Экскалупатор 4.7.2010, 01:03
разобрался с коллекциями, в принципе все оказалось довольно тривиально, можно использовать обычные массивы, списки и прочее(просто сразу думалось что тесты эти как то по другому работают).
в процессе возник другой вопрос: как тестировать приватные методы?

Автор: Exai1e 4.7.2010, 09:07
Экскалупатор, думаю что на уровне метода
Код

private void MyMethod()
{
...
            #if DEBUG

            Assert.AreEqual(....);

            #endif
...
}

Автор: Экскалупатор 4.7.2010, 10:39
может быть, но дело в том что студия умеет это делать, она генерит какой то интересный код и тестирует приватные методы. к примеру если тот метод что я привел выше делать тест, то студия делает такой код:
Код

[Shadowing("ConsoleApplication1.Program")]
    public class Program_Accessor : BaseShadow
    {
        protected static PrivateType m_privateType;

        [Shadowing(".ctor@0")]
        public Program_Accessor();
        public Program_Accessor(PrivateObject __p1);

        public static PrivateType ShadowedType { get; }

        public static Program_Accessor AttachShadow(object __p1);
        [Shadowing("Calculate@2")]
        public double Calculate(int a, int b);
        [Shadowing("Main@1")]
        public static void Main(string[] args);
    }

и дальше в тесте
Код

            Program_Accessor target = new Program_Accessor(); // TODO: Initialize to an appropriate value
                    int a = 1;
                    int b = 1;
                    double expected = 1;
                    double actual;
                    actual = target.Calculate(a, b);
                    Assert.AreEqual(expected, actual);

а вот как это все называется? и где про это прочесть...

Автор: jonie 4.7.2010, 12:52
читать про TDD

Автор: Mephisto 4.7.2010, 18:33
Когда тестируешь какой-то класс, или взаимодействие интерфейсов сочетанием тестов, то необходимо разделять тестируемые методы:
1 метод: ожидает корректные данные. Грузишь в метод данные и проверяешь результат.
остальные методы: исключительные ситуации. Т.е. сами методы загружают некорректные данные и в результате ожидаешь исключения вполне определенных типов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)