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 + .
и пусть он реализует классы / методы на ходу.
- У меня были некоторые проблемы при реализации общих классов. Например, когда я определяю
.Add(10)
метод, VS не знает, намереваюсь ли я использовать универсальный метод (так как класс является универсальным) илиAdd(int number)
метод. Есть ли способ дифференцировать это? - То же самое может случиться с типами возврата. Давайте предположим, что я реализую
MyStack
стека, и я хочу проверить, если после нажатия и элемент и всплывающее его, стек все еще пуст. Мы все знаем, что pop должен что-то возвращать, но обычно код этого теста не должен заботиться об этом. Visual Studio тогда будет думать, что pop - это пустой метод, который на самом деле не то, что нужно. Как с этим бороться? Должен ли я начинать с каждого метода "очень специфичные" тесты, например, очевидно, что метод должен что-то возвращать, чтобы я не получил такую двусмысленность? Даже если не использовать результат, я должен иметь что-то вродеint popValue = myStack.Pop()
? - Как я должен делать тесты на общие классы? Только тест с одним общим типом типа? Я использую
int
с, как они просты в использовании, но я должен также тестировать с различными видами объектов? Как вы обычно подходите к этому? - Я вижу, что есть популярный инструмент Test Driven для.NET. С выпуском VS 2010, это все еще полезно, или многие его функции теперь являются частью VS 2010, делая его вроде бесполезным?
- Всякий раз, когда я определяю новое свойство в своем тестовом коде и спрашиваю VS сгенерировать этот метод для меня, он генерирует и геттер, и сеттер. Если у меня есть что-то вроде
int val = MyClass.MyProperty
Я хотел бы понять, что (по крайней мере, пока) я хочу только определить получателя.
Спасибо
2 ответа
К вашему примеру кода, почему у вас есть метод RemoveAt(T obj)
?
Ты можешь сделать RemoveAt(int index)
а также Remove(T obj)
вместо. Взгляните на API-интерфейсы Microsoft (например, для List
А теперь для ваших очков:
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 для запуска модульных тестов.