Чи допомогли б одиничні тести Citigroup уникнути цієї дорогої помилки?


86

Я читав про цей сніфу: Програмування помилок коштує Citigroup 7 мільйонів доларів після того, як легальні транзакції помилялися з тестовими даними протягом 15 років .

Коли система була запроваджена в середині 1990-х, програмний код відфільтрував усі транзакції, яким було надано тризначні коди філій від 089 до 100, і використовував ці префікси для тестування.

Але в 1998 році компанія почала використовувати буквено-цифрові коди філій, оскільки розширювала свій бізнес. Серед них були коди 10В, 10С тощо, які система розглядала як такі, що не належать до виключеного діапазону, і тому їх транзакції були вилучені з будь-яких звітів, що надсилаються до SEC.

(Я думаю, це ілюструє, що використання неявного показника даних є ... неоптимальним. Набагато краще було б заповнити та використовувати семантично явну Branch.IsLiveвластивість.)

Що осторонь, моя перша реакція була "Одиничні тести допомогли б тут" ... але чи вони?

Нещодавно я прочитав Чому більшість одиниць тестування викликає інтерес, і тому моє запитання: як виглядатимуть одиничні тести, які не змогли б ввести буквено-цифрові кодові гілки?



17
Здається, вони також пропустили тест інтеграції, який перевіряв кількість транзакцій, експортованих до SEC. Якщо ви будуєте функцію експорту, це було б розумною перевіркою.
Люк Франкен

31
Автор статті, схоже, не розуміє одиничне тестування. Деякі твердження є просто смішними ( "одиничні тести навряд чи перевірять більше трильйони функціональності будь-якого методу" ), інші знищують шанс отримати регресію ( "подивіться на тести, які ніколи не провалювалися за рік і розглянути можливість їх викинути " ). Або такі пропозиції, як "перетворити тестові одиниці на твердження" , які повинні змінити невдалі тести на винятки з часу виконання?
Груо

25
@gnat Я не прочитав зовнішнє посилання, і я все-таки вважав це питання значимим
Jeutnarg

23
Що я того вартий, я майже не погоджуюся з усім у "Чому більшість одиниць тестування - це відходи". Я б написав спростування, але цей запас занадто малий, щоб його містити.
Роберт Харві

Відповіді:


19

Ви справді запитуєте, "чи допомогли б тут одиничні тести?", Чи ви запитуєте, "чи могли б тут допомогти будь-які види тестів?".

Найбільш очевидною формою тестування, яка могла б допомогти, є твердження передумови в самому коді, що ідентифікатор гілки складається лише з цифр (припустимо, що це припущення, на яке посилається кодер при написанні коду).

Тоді це могло б не вдатися до якогось тесту на інтеграцію, і як тільки будуть введені нові ідентифікатори алфавітно-числових гілок, твердження вибухає. Але це не одиничне випробування.

Крім того, може бути тест інтеграції процедури, яка генерує звіт SEC. Цей тест гарантує, що кожен реальний ідентифікатор філії повідомляє про свої транзакції (і тому вимагає введення в реальному світі, список усіх ідентифікаторів гілок, які використовуються). Тож це теж не одиничний тест.

Я не бачу жодного визначення або документації щодо залучених інтерфейсів, але можливо, тести одиниць не могли виявити помилку, оскільки пристрій не був несправним . Якщо підрозділу дозволено припускати, що ідентифікатори гілок складаються лише з цифр, і розробники ніколи не приймали рішення, що робити з коду, якщо він цього не зробив, то вони не повиннінаписати тест одиниці, щоб застосувати особливу поведінку у разі нецифрових ідентифікаторів, оскільки тест відкине гіпотетичну дійсну реалізацію блоку, який правильно обробляв буквено-цифрові ідентифікатори гілки, і зазвичай не хочеться писати тестовий пристрій, який запобігає дійсності майбутні реалізації та розширення. Або, можливо, в одному документі, написаному 40 років тому, неявно визначено (через деякий лексикографічний діапазон у сировинному EBCDIC, замість більш прийнятного для людини правила зіставлення), що 10B є тестовим ідентифікатором, оскільки він фактично падає між 089 і 100. Але тоді 15 років тому хтось вирішив використовувати його як справжній ідентифікатор, тому "несправність" не лежить у блоці, який правильно реалізує оригінальне визначення: він лежить у процесі, який не помітив, що 10B визначено як тестовий ідентифікатор, і тому його не слід призначати до гілки. Те ж саме станеться і в ASCII, якби ви визначили 089 - 100 як тестовий діапазон, а потім ввели ідентифікатор 10 $ або 1,0. Так буває, що в EBCDIC цифри надходять після літер.

Один одиничний тест (або, можливо, функціональний тест), що мислимоможливо, врятував день, це тест одиниці, яка генерує або перевіряє нові ідентифікатори гілок. Цей тест стверджує, що ідентифікатори повинні містити лише цифри, і вони будуть записані для того, щоб дозволити користувачам ідентифікаторів гілок приймати те саме. Або, можливо, десь є підрозділ, який імпортує реальні ідентифікатори гілок, але ніколи не бачить тестових, і це може бути перевірено одиницею, щоб переконатись, що він відхиляє всі тестові ідентифікатори (якщо ідентифікаторів лише три символи, ми можемо перерахувати їх усі, і порівняти поведінку валідатор до тестового фільтра для забезпечення їх відповідності, що стосується звичайного заперечення проти тестових тестів). Тоді, коли хтось змінив правила, одиничний тест був би невдалим, оскільки він суперечить новоспеченій поведінці.

Оскільки тест був там з поважних причин, то момент, коли вам потрібно його зняти через змінені вимоги бізнесу, стає можливістю для того, щоб хтось отримав роботу, "знаходимо кожне місце в коді, яке покладається на поведінку, яку ми хочемо змінити ". Звичайно, це важко і, отже, ненадійно, тому жодним чином не гарантує збереження дня. Але якщо ви захопити ваші припущення в тестах одиниці , які ви припускає властивість, то ви дали собі шанс , і тому зусилля не повністю даремно.

Я погоджуюся, звичайно, що якби пристрій не було визначено в першу чергу за допомогою "смішної форми", тестувати нічого не було б. Виразно розділити простір імен може бути важко перевірити належним чином, оскільки складність не полягає у здійсненні вашого смішного визначення, воно полягає у тому, щоб переконатися, що всі розуміють і поважають ваше смішне визначення. Це не локальна властивість одного блоку коду. Крім того, зміна деякого типу даних з "рядка цифр" на "рядок буквено-цифрових" схоже на те, щоб зробити обробку програми на основі ASCII Unicode: це буде не просто, якщо ваш код сильно пов'язаний з початковим визначенням, і коли тип даних є основоположним для того, що робить програма, тоді він часто сильно пов'язаний.

трохи заважає думати, що це значною мірою витрачає сили

Якщо тести вашого пристрою іноді не спрацьовують (наприклад, наприклад, ви рефакторинг) і надаєте корисну інформацію (наприклад, ваша зміна неправильна), зусилля не витрачалися даремно. Те, що вони не роблять, - це перевірити, чи працює ваша система. Тож якщо ви пишете одиничні тести замість того, щоб випробовувати функціональні та інтеграційні тести, можливо, ви використовуєте свій час суб-оптимально.


Твердження хороші!

3
@nocomprende: як це було у Рейгана, "довіряй, але перевіряй".
Стів Джессоп

1
Я також збирався сказати "Одиничні тести погані!" але я думав, що більшість людей пропустять посилання на Ферму тварин і почнуть насправді критикувати мене, а не думати про те, що я говорю (відповіді на ривок колін неефективні), але я цього не сказав. Можливо, людина, яка розумніша і має більшу ерудицію, може зробити це.

2
"Усі тести проходять, але деякі тести БОЛЬШІ, ніж інші!"
Грем

1
тестування - червона оселедець. Ці хлопці просто не знали, як визначається "код філії". Це було б так, як поштове відділення США не знало, що воно змінює визначення поштового індексу, коли додає 4 цифри.
radarbob

120

Одиничні тести могли б зрозуміти, що коди філій 10B та 10C були неправильно класифіковані як "тестуючі гілки", але я вважаю малоймовірним, що тести для цієї класифікації філій були б досить обширними, щоб зрозуміти цю помилку.

З іншого боку, точкові перевірки згенерованих звітів могли виявити, що розгалужені 10B та 10C послідовно відсутні у звітах набагато раніше, ніж за 15 років, коли помилка тепер могла залишатися присутнім.

Нарешті, це гарна ілюстрація того, чому погано ідею поєднувати дані тестування з реальними даними про виробництво в одній базі даних. Якби вони використовували окрему базу даних, яка містить дані тестування, не було б необхідності фільтрувати це з офіційних звітів, і фільтрувати їх було б неможливо.


80
+1 Тести блоку ніколи не можуть компенсувати погані дизайнерські рішення (наприклад, тест на змішування та реальні дані)
Jeutnarg

5
Хоча найкраще уникати змішування тестових даних з реальними даними, перевірити виробничу систему може бути важко, якщо для цього потрібні зміни реальних даних. Наприклад, погана ідея перевірити банківську систему шляхом зміни суми банківських рахунків у виробництві. Використання діапазонів коду для позначення значення є проблематичним. Більш чіткий атрибут записів, мабуть, був би кращим вибором.
JimmyJames

4
@Voo Я думаю, що існує мовчазне припущення, що існує рівень складності або вимоги надійності, коли тестування реальної розгорнутої виробничої системи вважається доцільним або необхідним. (Поміркуйте, скільки може піти не так через неправильну змінну конфігурації.) Я міг би бачити, що це стосується великої фінансової установи.
jpmc26

4
@Voo Я не говорю про тестування. Я говорю про валідацію системи. У реальній виробничій системі існує багато способів її виходу з ладу, що не мають нічого спільного з кодом. Якщо ви впроваджуєте нову банківську систему у виробництво, у вас може виникнути певна проблема в db або мережі тощо, що перешкоджає застосуванню транзакцій до рахунків. Я ніколи не працював у банку, але я впевнений, що нахмурився почати змінювати реальні рахунки за допомогою фальшивих транзакцій. Таким чином, ви залишаєте або налаштовувати підроблені рахунки, або чекати і молитися.
JimmyJames

12
@JimmyJames У галузі охорони здоров’я звичайно періодично копіювати виробничу базу даних у тестове середовище для проведення тестування даних, максимально наближених до реальних; Я думаю, що банк може зробити те саме.
dj18

75

Програмне забезпечення повинно було обробляти певні правила ведення бізнесу. Якби були одиничні тести, одиничні тести перевірили б, чи програмне забезпечення правильно обробляло бізнес-правила.

Правила бізнесу змінилися.

Мабуть, ніхто не зрозумів, що правила бізнесу змінилися, і ніхто не змінив програмне забезпечення для застосування нових правил бізнесу. Якби були одиничні тести, ці одиничні тести потрібно було б змінити, але ніхто цього не зробив би, оскільки ніхто не зрозумів, що правила бізнесу змінилися.

Тож ні, одиничні тести цього б не впіймали.

Виняток становитиме, якби одиничні тести та програмне забезпечення були створені незалежними командами, а команда, яка проводила одиничні тести, змінила тести на застосування нових правил бізнесу. Тоді б одиничні тести не змогли б, що, сподіваємось, призвело б до зміни програмного забезпечення.

Зрозуміло, у тому ж випадку, якби було змінено лише програмне забезпечення, а не тести на одиницю, то тести для одиниць також не зможуть. Кожен раз, коли тест не працює, це не означає, що програмне забезпечення є неправильним, це означає, що або програмне забезпечення, або тест одиниці (іноді і те й інше) є помилковими.


2
Чи можливо створити різні команди, де одна працює над кодом, а інша - на "одиничних" тестах? Як це можливо? ... Я весь час переробляю свій код.
Серхіо

2
@Sergio з однієї точки зору, рефакторинг змінює внутрішні органи, зберігаючи поведінку - тому якщо тест написаний таким чином, що тестує поведінку, не покладаючись на внутрішні, то оновлення не потребує.
Daenyth

1
Я бачив, як це трапляється не раз. Програмне забезпечення виробляється без скарг, тоді раптом користувачі вибухають зі скаргами на те, що воно більше не працює і поступово виходить з ладу протягом багатьох років. Ось що відбувається, коли ви вирішите піти і змінити свої внутрішні процедури, не дотримуючись стандартного процесу сповіщення ...
Брайан Ноблеуч

42
"Правила бізнесу змінилися" є критичним спостереженням. Експертні тести підтверджують, що ви реалізували логіку, яку ви вважали реалізованою , а не, щоб ваша логіка була правильною .
Райан Кавано

5
Якщо я маю рацію щодо того, що сталося, навряд чи було б написано одиничне тестування. Основний принцип вибору тестів полягає в тестуванні деяких «хороших» випадків, деяких «поганих» випадків та випадків, що містять будь-які межі. У цьому випадку ви протестуєте "099", "100" та "101". Оскільки "10B" охоплюється тестами "відхилити неномери" за старою системою і перевищує 101 (і так охоплюється тестуванням, що) у новій системі, немає ніяких причин перевіряти це - крім того, що в EBCDIC, "10B" розбирається між "099" і "100".
Марк

29

Ні. Це одна з найбільших проблем при тестуванні одиниць: вони заколисують вас у помилкове почуття безпеки.

Якщо всі ваші тести пройдуть, це не означає, що ваша система працює правильно; це означає, що всі ваші тести проходять . Це означає, що частини вашого дизайну, про які ви свідомо думали і писали тести, працюють так, як ви свідомо думали, що це буде, що все-таки не так вже й багато: на речі, на що ви насправді приділяли пильну увагу до, так що, швидше за все, ви все одно зрозуміли! Але це не робить нічого, щоб зловити випадки, про які ви ніколи не думали, як, наприклад, цей, бо ви ніколи не думали написати тест на них. (І якби у вас було, ви б знали, що це означає зміни коду, і ви б їх змінили.)


17
Мій батько питав мене так: Чому ти не придумав те, про що ти не думав? (Тільки він звик плутати, кажучи: "Якщо ти не знаєш, питай !") Але як мені знати, що я не знаю?

7
"Це означає, що частини вашого дизайну, про які ви свідомо думали і писали тести, працюють так, як ви свідомо думали, що це буде". Точно правильно. Ця інформація є неоціненною, якщо ви займаєтесь рефакторингом або якщо щось змінюється десь в системі, що порушує ваші припущення. Розробники, закохані в помилковому почутті безпеки, просто не розуміють обмежень тестування одиниць, але це не робить тестування одиниць непотрібним інструментом.
Роберт Харві

12
@MasonWheeler: Як і ви, автор вважає, що тестування блоку якось повинно довести, що ваша програма працює. Це не так. Повторю це: тестування приладів не доводить, що ваша програма працює. Блок тестування доводить, що ваші методи виконують ваш контракт на тестування, і це все, що він робить. Інша частина паперу падає вниз, тому що вона спирається на одне недійсне приміщення.
Роберт Харві

5
Природно, розробники, які мають помилкове переконання, будуть розчаровані, коли тестування одиниць їх повністю не вдається, але це винна розробник, а не тестування одиниць, і це не скасовує справжнє значення, яке надає одиничне тестування.
Роберт Харві

5
o_O @ ваше перше речення. Експериментальні випробування дають помилкове почуття безпеки, а кодування, як руки на кермі, дає помилкове відчуття безпеки під час руху.
djechlin

10

Ні, не обов’язково.

Початкова вимога полягала у використанні числових кодів гілок, тому для компонента, який приймав різні коди та відхиляв будь-які подібні 10B, було б виготовлено одиничне тестування. Система була б передана як робоча (якою вона була).

Тоді вимога була б змінена і коди оновлені, але це означало б, що код тестування одиниць, який постачав погані дані (тобто хороші дані), повинен був би бути змінений.

Тепер ми припускаємо, що люди, що керують системою, знали б, що це так, і змінили б тестовий пристрій для обробки нових кодів ... але якби вони знали, що відбувається, вони також знали б змінити код, який обробляє ці коди все одно .. і вони цього не робили. Тест одиниці, який спочатку відкинув код 10B, із задоволенням сказав би "все добре", коли ви запустите, якби ви не знали оновити цей тест.

Тестування приладів добре для оригінальної розробки, але не для тестування системи, особливо не через 15 років після того, як вимоги давно забуті.

Те, що їм потрібно в такій ситуації, - це тест на цілі інтеграції. Один, де ви можете передати дані, які ви очікуєте на роботу, і побачити, чи це так. Хтось зауважив би, що їхні нові вхідні дані не складають звіт, а потім будуть досліджувати далі.


Пляма на. І головна (тільки?) Проблема з одиничними тестами. Врятував мене, формулюючи власну відповідь, так як я сказав би саме те саме (але, мабуть, гірше!) :)
Гонки легкості в орбіті

8

Тестування типів (процес тестування інваріантів з використанням випадково згенерованих дійсних даних, як на прикладі тестової бібліотеки Haskell QuickCheck та різних портів / альтернатив, натхненних нею іншими мовами) цілком може наздогнати цю проблему, одиничне тестування майже напевно не зробило б .

Це тому, що коли правила щодо дійсності кодів філій були оновлені, навряд чи хтось подумав би перевірити ці конкретні діапазони, щоб переконатися, що вони працюють правильно.

Однак, якщо тестування типів використовувалося, хтось повинен під час впровадження оригінальної системи записати пару властивостей, один для перевірки того, що конкретні коди для тестових гілок трактуються як дані тестування, і один для перевірки відсутності інших кодів були ... коли визначення типу даних для коду гілки було оновлено (що було б потрібно для того, щоб дозволити тестувати, що будь-яка зміна коду гілки від цифр до числового працювала), цей тест розпочав би тестування значень у новий асортимент і, швидше за все, виявив би несправність.

Звичайно, QuickCheck був вперше розроблений у 1999 році, тому вже було пізно, щоб зайнятися цим питанням.


1
Я думаю, що це нормальніше викликати тестування на основі властивостей, і, звичайно, так само можливо написати тест на основі властивостей, який все-таки пройшов би з огляду на цю зміну (хоча я думаю, що ви більше шансів написати тест, який міг би його знайти)
jk.

5

Я дійсно сумніваюся, що одиничне тестування змінило б цю проблему. Це звучить як одна з таких ситуацій бачення тунелю, оскільки функціональність була змінена для підтримки нових кодів філій, але це не було здійснено у всіх областях системи.

Ми використовуємо тестування одиниць для проектування класу. Повторний тест блоку необхідний лише в тому випадку, якщо дизайн змінився. Якщо певна одиниця не змінюється, тести незміненої одиниці повернуть ті самі результати, що і раніше. Одиничні тести не збираються показувати вплив змін на інші підрозділи (якщо вони зроблені, ви не пишете одиничні тести).

Виявити цю проблему можна лише за допомогою:

  • Інтеграційні тести - але вам доведеться спеціально додавати нові формати коду для подачі через декілька одиниць у системі (тобто вони показуватимуть вам проблему лише у тому випадку, якщо в оригінальні тести були включені чинні гілки)
  • Кінцеве тестування - бізнес повинен запустити тест "в кінці", який включає старі та нові формати кодових галузей

Не вистачає достатнього кінцевого тестування викликає занепокоєння. Ви не можете розраховувати на тестування одиниць як ТІЛЬКИ або ОСНОВНИЙ тест для системних змін. Схоже, що потрібно лише комусь запустити звіт про нещодавно підтримувані формати філійного коду.


2

Твердження, вбудоване в час виконання, могло б допомогти; наприклад:

  1. Створіть функцію на кшталт bool isTestOnly(string branchCode) { ... }
  2. За допомогою цієї функції можна визначити, які звіти відфільтрувати
  3. Повторно використовуйте цю функцію в твердженні, в коді створення гілки, щоб перевірити або стверджувати, що гілка не (не може бути) створена за допомогою цього типу коду філії‼
  4. Увімкніть це твердження в режимі реального часу (а не "оптимізовано, за винятком версії коду для розробника", призначеної лише для налагодження)‼

Дивитися також:


2

Витяг з цього - на Fail Fast .

У нас немає коду, а також не маємо багато прикладів префіксів, які є або не є тестовими префіксами гілок відповідно до коду. Все, що ми маємо, це:

  • 089 - 100 => тестова галузь
  • 10В, 10С => тестова гілка
  • <088 => імовірно реальні гілки
  • > 100 => імовірно реальні гілки

Те, що код дозволяє числа та рядки, більш ніж трохи дивне. Звичайно, 10B та 10C можна вважати шістнадцятковими числами, але якщо всі префікси трактуються як шістнадцяткові числа, 10B та 10C потрапляють поза тестовим діапазоном і вважатимуться справжніми гілками.

Це, ймовірно, означає, що префікс зберігається як рядок, але в деяких випадках трактується як число. Ось найпростіший код, який я можу придумати, що повторює цю поведінку (використовуючи C # для ілюстративних цілей):

bool IsTest(string strPrefix) {
    int iPrefix;
    if(int.TryParse(strPrefix, out iPrefix))
        return iPrefix >= 89 && iPrefix <= 100;
    return true; //here is the problem
}

Англійською мовою, якщо рядок є числом і становить від 89 до 100, це тест. Якщо це не число, це тест. Інакше це не тест.

Якщо код слід за цією схемою, жоден тестовий пристрій не вловив би це під час розгортання коду. Ось кілька прикладних тестів одиниць:

assert.isFalse(IsTest("088"))
assert.isTrue(IsTest("089"))
assert.isTrue(IsTest("095"))
assert.isTrue(IsTest("100"))
assert.isFalse(IsTest("101"))
assert.isTrue(IsTest("10B")) // <--- business rule change

Тест одиниці показує, що "10B" слід розглядати як тестову гілку. Користувач @ gnasher729 вище говорить, що правила бізнесу змінилися, і ось що показує останнє твердження вище. У якийсь момент це ствердження повинно було перейти на isFalse, але цього не сталося. Тестові одиниці запускаються під час розробки та часу нарощування, але потім у будь-який момент.


Що тут урок? Коду потрібен певний спосіб сигналізувати, що він отримав несподіваний вхід. Ось альтернативний спосіб написання цього коду, який підкреслює, що він очікує, що префікс буде числом:

// Alternative A
bool TryGetIsTest(string strPrefix, out bool isTest) {
    int iPrefix;
    if(int.TryParse(strPrefix, out iPrefix)) {
        isTest = iPrefix >= 89 && iPrefix <= 100;
        return true;
    }
    isTest = true; //this is just some value that won't be read
    return false;
}

Для тих, хто не знає C #, значення, що повертається, вказує, чи міг код проаналізувати префікс із заданого рядка. Якщо значення повернення є істинним, викликовий код може використовувати змінну isTest out, щоб перевірити, чи є префікс гілки тестовим префіксом. Якщо значення повернення помилкове, викликовий код повинен повідомити, що даний префікс не очікується, а змінна isTest out є безглуздою і її слід ігнорувати.

Якщо ви все з винятками, можете зробити це замість цього:

// Alternative B
bool IsTest(string strPrefix) {
    int iPrefix = int.Parse(strPrefix);
    return iPrefix >= 89 && iPrefix <= 100;
}

Ця альтернатива є більш простою. У цьому випадку викликовий код повинен виловлювати виняток. У будь-якому випадку код повинен мати певний спосіб повідомляти абоненту, що він не очікував strPrefix, який не вдалося перетворити на ціле число. Таким чином код швидко виходить з ладу, і банк може швидко знайти проблему без дрібного збентеження SEC.


1

Стільки відповідей і навіть не одна цитата Дійкстри:

Тестування показує наявність, а не відсутність помилок.

Тому це залежить. Якщо код був тестований належним чином, швидше за все, ця помилка не існувала б.


-1

Я думаю, що одиничне випробування тут забезпечило б, щоб ця проблема ніколи не існувала.

Подумайте, ви написали bool IsTestData(string branchCode)функцію.

Перший одиничний тест, який ви записуєте, повинен мати нульовий та порожній рядок. Тоді для рядків неправильної довжини, а потім для не цілих рядків.

Щоб пройти всі ці тести, вам доведеться додати функцію перевірки параметрів.

Навіть якщо ви лише тестуєте на "хороші" дані 001 -> 999, не замислюючись про можливість 10A, перевірка параметрів змусить вас переписати функцію, коли ви почнете використовувати буквено-цифрові знаки, щоб уникнути винятків, які вона викине


1
Це не допомогло б - функція не була змінена, і тест не почався б невдало, отримавши ті самі дані тесту. Хтось повинен був би подумати про тест, щоб зробити його невдалим, але якби вони подумали про це, вони, напевно, подумали б і про зміну функції.
Халк

(Або, можливо, мені щось не вистачає, оскільки я не впевнений, що ви маєте на увазі під "перевірка параметрів")
Халк

Функція буде змушена кинути виняток для не цілих рядків для замовлення, щоб пройти тест одиничного простого регістру. Отже, виробничий код помиляється, якщо ви почали використовувати буквено-цифрові коди гілок без конкретного програмування для них
Ewan

Але хіба функція не використала б якусь функцію IsValidBranchCodeдля здійснення цієї перевірки? І ця функція, мабуть, була б змінена без необхідності змінювати IsTestData? Тож якщо ви протестуєте лише "хороші дані", тест не допоможе. Тест крайового регістру повинен був включати якийсь чинний код філії (а не просто ще недійсний), щоб почати виходити з ладу.
Халк

1
Якщо перевірка в IsValidCode, так що функція проходить без власної явної перевірки, то так, можливо, її можна пропустити, але тоді у нас буде додатковий набір ще більше тестів, знущаються з валідаторів тощо. Ще більше шансів на конкретні "це тестові номери »
Ewan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.