Visual Studio 2010 и тестовая разработка - PullRequest
6 голосов
/ 16 мая 2010

Я делаю первые шаги в тестовой разработке с помощью Visual Studio. У меня есть несколько вопросов относительно того, как реализовать универсальные классы с VS 2010.

Во-первых, допустим, я хочу реализовать свою собственную версию ArrayList. Я начинаю с создания следующего теста (в данном случае я использую MSTest):

[TestMethod]
public void Add_10_Items_Remove_10_Items_Check_Size_Is_Zero() {
    var myArrayList = new MyArrayList<int>();

    for (int i = 0; i < 10; ++i) {
        myArrayList.Add(i);
    }

    for (int i = 0; i < 10; ++i) {
        myArrayList.RemoveAt(0); //should this mean RemoveAt(int) or RemoveAt(T)?
                                 //VS doesn't know. Any work arounds?
    }

    int expected = 0;
    int actual = myArrayList.Size;
    Assert.AreEqual(expected, actual);
}

Я использую способность VS 2010 для удара

Ctrl +.

и пусть он реализует классы / методы на ходу.

  1. У меня были некоторые проблемы при реализации универсальных классов. Например, когда я определяю метод .Add(10), VS не знает, намереваюсь ли я использовать универсальный метод (так как класс является универсальным) или метод Add(int number). Есть ли способ дифференцировать это?
  2. То же самое может случиться с типами возврата. Давайте предположим, что я реализую стек MyStack, и я хочу проверить, если после нажатия и элемента и всплывающего его, стек все еще пуст. Мы все знаем, что pop должен что-то возвращать, но обычно код этого теста не должен заботиться об этом. Visual Studio тогда будет думать, что pop - это пустой метод, который на самом деле не то, что нужно. Как с этим бороться? Должен ли я начинать с каждого метода «очень специфичные» тесты, например, очевидно, что метод должен что-то возвращать, чтобы я не получил такую ​​двусмысленность? Даже если не использовать результат, я должен иметь что-то вроде int popValue = myStack.Pop()?
  3. Как мне делать тесты для общих классов? Только тест с одним общим типом типа? Я использовал int s, так как они просты в использовании, но должен ли я также тестировать с различными типами объектов? Как вы обычно подходите к этому?
  4. Я вижу, что есть популярный инструмент TestDriven для .NET. С выпуском VS 2010, это все еще полезно, или многие его функции теперь являются частью VS 2010, делая его немного бесполезным?
  5. Всякий раз, когда я определяю новое свойство в своем тестовом коде и прошу VS сгенерировать этот метод-заглушку для меня, он генерирует и геттер, и сеттер. Если у меня есть что-то вроде int val = MyClass.MyProperty, я бы хотел понять, что (по крайней мере, пока) я хочу определить только геттер.

Спасибо

Ответы [ 2 ]

3 голосов
/ 16 мая 2010

К вашему примеру кода, почему у вас есть метод RemoveAt(T obj)?

Вместо этого вы можете сделать RemoveAt(int index) и Remove(T obj). Взгляните на API-интерфейсы Microsoft (например, для Списка ), которые показывают, как они настраивают методы Remove для универсальной коллекции.

А теперь ваши очки:

1: Что бы сделал Add(int number)? Если я правильно понимаю ваши намерения, Add(10) можно интерпретировать только как «Добавьте значение 10 в конце моей коллекции». Если вы хотите добавить значение по определенному индексу, вы можете (и, вероятно, должны) назвать этот метод Insert: Insert(int index, T value).

2: конечно, Visual Studio сначала будет интерпретировать метод как void, но вы можете отредактировать его как

public class MyStack<T>
{
    public T Pop() 
    {
    }
}

Заглушки, созданные нажатием Ctrl+., удобны, а не Евангелие. Вы НЕ ДОЛЖНЫ всегда присваивать возвращаемое значение переменной. Если вам не нужно это в тесте, не делайте этого. Если вы хотите, чтобы VS обнаружил тип возврата, отличный от void, вы можете написать другой модульный тест (например, что Pop () возвращает последнее переданное значение).

3: я бы протестировал типы, которые я вижу наиболее часто используемые в моем коде. Если вы пишете общедоступный API, протестируйте как можно больше типов. Если вы используете NUnit, обратите внимание на использование атрибута [TestCase], чтобы избежать написания повторяющегося кода.

4: Я все еще использую TestDriven, но я не пробовал обходиться без него, поэтому я не могу сделать полезное сравнение.

5: Просто удалите сеттер, если он вам не нужен. Некоторые дополнительные структуры, такие как ReSharper , поддерживают более сложную генерацию кода, включая свойства только для чтения.

3 голосов
/ 16 мая 2010

Я вижу, что есть популярный инструмент TestDriven для .NET. С выпуском VS 2010, это все еще полезно, или многие его функции теперь являются частью VS 2010, делая его немного бесполезным?

Это все еще полезно, если вы используете одну из нескольких различных платформ модульного тестирования ( nunit , mbunit , xunit , csunit и т. д.).

Существуют также другие инструменты (например, Visual Nunit ), которые обеспечивают интеграцию Visual Studio для запуска модульных тестов.

...