Visual Studio 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с, как они просты в использовании, но я должен также тестировать с различными видами объектов? Как вы обычно подходите к этому?
  4. Я вижу, что есть популярный инструмент Test Driven для.NET. С выпуском VS 2010, это все еще полезно, или многие его функции теперь являются частью VS 2010, делая его вроде бесполезным?
  5. Всякий раз, когда я определяю новое свойство в своем тестовом коде и спрашиваю VS сгенерировать этот метод для меня, он генерирует и геттер, и сеттер. Если у меня есть что-то вроде int val = MyClass.MyProperty Я хотел бы понять, что (по крайней мере, пока) я хочу только определить получателя.

Спасибо

2 ответа

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

Ты можешь сделать RemoveAt(int index) а также Remove(T obj) вместо. Взгляните на API-интерфейсы Microsoft (например, для List;), в которых показано, как они настраивают методы 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, поддерживают более сложную генерацию кода, включая свойства только для чтения.

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

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

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

Другие вопросы по тегам