или "Как писать тесты на расширение поведения контролов?"
Например, у меня есть контрол MyTextEdit и у него сейчас есть свойство "repaintChangesOnly {false, true}". В моем текущем проекте много таких свойств: сначала сделали одну реализацию (и кучу тестов на нее), потом один из клиентов сообщил о ее недостатках и мы придумали другую (и добавили новое свойство). Обычное дело в долгоиграющем проекте на несколько лет.
И для этого "обычного дела" я сейчас часто вижу "половину" тестов.
Во-первых, это сценарии от клиентов для проблем с новым режимом, тесты типа таких:
[Test]
public void Show_DoAction12345() {
MyTextEdit textEdit = new MyTextEdit();
textEdit.repaintChangesOnly = true;
DoAction1();
...
Assert.IsTrue(passed);
}
Уже здесь видно что результаты работы моего контрола в режиме "repaintChangesOnly: false" в этом сценарии не проверяются.
Во-вторых, это "старые" тесты, которые написали когда свойства "repaintChangesOnly" вообще не было:
[Test]
public void Show_DoAction1() {
MyTextEdit textEdit = new MyTextEdit();
DoAction1();
...
Assert.IsTrue(passed);
}
[false, true].forEach(repaintChangesOnly => {
[false, true].forEach(deferRendering => {
[false, true].forEach(animationEnabled => {
const context = { repaintChangesOnly, deferRendering, animationEnabled };
const contextName = JSON.stringify(context);
test("show [], " + contextName, () => {
var tree = new MyTree(context, []);
..
}
test("show [a], " + contextName, () => {
var tree = new MyTree(context, ['a']);
..
}
test("show [a, b], " + contextName, () => {
var tree = new MyTree(context, ['a', 'b']);
..
}
...
})
----
Что делать если контрол с моим новым PaintMode.V2 в некоторых сценария приводит к неправильным результатам? Ведь польза от него явно есть, клиенту отдали и он доволен, эти "некоторые сценарии" ему до лампочки...
Для этой ситуации в описании значения V2 для свойства PaintMode я добавляю в его документацию "Сценарий ХХ не будет работать если присвоено значение V2" и исключаю этот проверку результатов для расклада {repaintChangesOnly: true} из конкретного теста который проверяет этот сценарий.
Например, у меня есть контрол MyTextEdit и у него сейчас есть свойство "repaintChangesOnly {false, true}". В моем текущем проекте много таких свойств: сначала сделали одну реализацию (и кучу тестов на нее), потом один из клиентов сообщил о ее недостатках и мы придумали другую (и добавили новое свойство). Обычное дело в долгоиграющем проекте на несколько лет.
И для этого "обычного дела" я сейчас часто вижу "половину" тестов.
Во-первых, это сценарии от клиентов для проблем с новым режимом, тесты типа таких:
[Test]
public void Show_DoAction12345() {
MyTextEdit textEdit = new MyTextEdit();
textEdit.repaintChangesOnly = true;
DoAction1();
...
Assert.IsTrue(passed);
}
Уже здесь видно что результаты работы моего контрола в режиме "repaintChangesOnly: false" в этом сценарии не проверяются.
Во-вторых, это "старые" тесты, которые написали когда свойства "repaintChangesOnly" вообще не было:
[Test]
public void Show_DoAction1() {
MyTextEdit textEdit = new MyTextEdit();
DoAction1();
...
Assert.IsTrue(passed);
}
С таким тестом результаты работы в режиме "repaintChangesOnly: true" в этом сценарии вообще не проверяются.
По моему опыту это получается отложенная работа: когда добавили новый режим, то работу контрла в новом режиме на старых сценариях не проверяли, "тут нечему ломаться" или "это не понадобится".. Но вот сейчас сразу и понадобилось и не работает и я разбираюсь как быть, только часто я "не в контексте" этого кода (сотрудники "в контексте" уже пару лет как работают в другой компании).
Подобная задача с repaintChangesOnly подразумевает что у меня на самом деле два контрола, которые работают по разному, только я упаковал их в один класс и сделал свойство переключатель.
Сейчас я делаю для них запуск всей группы тестов в каждой конфигурации: каждый тест проверяет свой сценарий и на каждую конфигурацию в тесте есть своя проверка результатов. При появлении новой конфигурации (например добавление опции "repaintChangesOnly") я добавляю новый цикл на все тесты и они начинают проверять результаты для обоих значений:
[false, true].forEach(deferRendering => {
[false, true].forEach(animationEnabled => {
const context = { repaintChangesOnly, deferRendering, animationEnabled };
const contextName = JSON.stringify(context);
test("show [], " + contextName, () => {
var tree = new MyTree(context, []);
..
}
test("show [a], " + contextName, () => {
var tree = new MyTree(context, ['a']);
..
}
test("show [a, b], " + contextName, () => {
var tree = new MyTree(context, ['a', 'b']);
..
}
...
}
}})
----
Что делать если контрол с моим новым PaintMode.V2 в некоторых сценария приводит к неправильным результатам? Ведь польза от него явно есть, клиенту отдали и он доволен, эти "некоторые сценарии" ему до лампочки...
Для этой ситуации в описании значения V2 для свойства PaintMode я добавляю в его документацию "Сценарий ХХ не будет работать если присвоено значение V2" и исключаю этот проверку результатов для расклада {repaintChangesOnly: true} из конкретного теста который проверяет этот сценарий.
Комментариев нет:
Отправить комментарий