-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Леонтьев Дмитрий #19
base: master
Are you sure you want to change the base?
Леонтьев Дмитрий #19
Conversation
Task complete
Number validator task
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Посмотрел пока только NumberValidator
bool onlyPositive, | ||
string expectedResultValue) | ||
{ | ||
return new NumberValidator(precision, scale, onlyPositive).IsValidNumber(expectedResultValue); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Здесь ассерт забыл. Должно быть что-то типа Should().BeTrue() или тому подобное, в зависимости от того, что ты хочешь проверить.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
resolved
[TestCase(3, 1, false, "-1,1", ExpectedResult = true, TestName = "precision 3, scale 1, not only positive, result -1,1")] | ||
[TestCase(2, 0, true, "+1", ExpectedResult = true, TestName = "precision 2, scale 0, only positive, result +1")] | ||
[TestCase(3, 1, true, "+1.1", ExpectedResult = true, TestName = "precision 3, scale 1, only positive, result +1.1")] | ||
[TestCase(3, 1, true, "+1,1", ExpectedResult = true, TestName = "precision 3, scale 1, only positive, result +1,1")] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я бы предложил сгруппировать тест-кейсы по категориям и отобразить это на уровне методов (разные методы сделать для разных проверок) и на уровне названий (TestName отражает суть проверки, а не перечисляет входные параметры). У тебя так сделано для тестов на конструктор.
Так будет более структурировано, и читать такие тесты будет гораздо легче 🙂
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
resolved
|
||
[TestCase(-1, TestName = "negative precision")] | ||
[TestCase(0, TestName = "zero precision")] | ||
public void NumberValidator_IncorrectPrecision_AfterCreatingIncorrectValidator(int precision, int scale = 0) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
У тестов на конструктор имена не очень удались. Лучше что-нибудь типа
Contructor_WithIncorrectPrecision_Throws (по принципу Что_ПриКакихУсловиях_КакойРезультат)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
resolved
options | ||
.AllowingInfiniteRecursion() | ||
.Excluding(o => o.Id) | ||
.Excluding(o => o.Parent.Id)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ага, а если будет 3 поколения, будет работать?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
resolved
// При изменении класса Person придётся изменять метод AreEqual, | ||
// т.е. если мы добавим поле в Person, то придётся добавить проверку на него в этом методе. | ||
// При провале теста мы не получаем конкретной информации из-за чего тест не прошёл, | ||
// т.к. метод AreEqual возвращает bool и скажет нам только Success или Failed. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ага, все так
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
resolved
all tasks corrected
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Со структурой теперь лучше. Можно обсудить количество тесткейсов.
длина чисел:
- целая часть меньше/больше/равна допустимому, дробная меньше/больше/равна (для полного покрытия можно попарно скомбинировать)
- длина чисел со знаком
знак числа:
- onlyPositive true/false и варианты +/-/отсутствие знака (попарно скомбинировать)
нечисловая строка/не соответствующая по формату
- пустая (у тебя есть)
- null (у тебя есть)
- как пробелы обрабатываются (внутри, на краях)
- как буквы обрабатываются
- ... другие эксперименты с форматом строки
Общая суть: берешь один из проверяемых параметров и комбинаторикой перебираешь все возможные кейсы.
.BeEquivalentTo(expectedTsar, options => | ||
options | ||
.AllowingInfiniteRecursion() | ||
.Excluding(o => o.DeclaringType == typeof(Person) && o.Name == nameof(Person.Id))); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Теперь окей. При сравнении объектового графа еще иногда полезно игнорировать циклические ссылки. Но в данном случае это не обязательно, тут по бизнеслогике цари в династии повторяться не должны вроде как)
|
||
[TestCase(".0", TestName = "intPart is missing")] | ||
[TestCase("0.", TestName = "fracPart part is missing")] | ||
public void IsValidNumber_MatchIsNotSuccess_ReturnsFalse(string expectedResultValue) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Вот тут имя концептуально неверное). Ты должен проверять бизнес-кейсы, а не догадываться, что в реализации есть некий Matсh по регулярке, который ничего не найдет.
Понятно, что ты можешь заглянуть в реализацию и на основе этого писать тесты, в данном случае так и нужно делать. Но класс с тестами должен быть написан в терминах бизнес-требований, а не нюансов реализации.
} | ||
|
||
[TestCase(2, 0, true, "+1", TestName = "number with a plus")] | ||
public void IsValidNumber_CorrectPlus_ReturnsTrue( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
С названиями теперь в целом хорошо. Совсем минорная шутка: на мой вкус не хватает какого-нибудь предлога во второй части, чтобы это было не просто Что_Условия_Результат, а Что_ПриКакихУсловиях_Результат. В тестах на конструктор ты используешь With, а ниже предлог потерялся.
ClassicAssert.IsFalse(new NumberValidator(17, 2, true).IsValidNumber("0.000")); | ||
ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-1.23")); | ||
ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("a.sd")); | ||
private static NumberValidator GetCorrectValidator(bool onlyPositive = false) => new(2, 1, onlyPositive); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
На мой взгляд, в таких маленьких тестах это не нужно. Обычно тест должен быть максимально наглядным и это нормально, если в 10 методах подряд написано new NumberValidator(), зато сразу видно с какими параметрами. В тестах, где блок Arrange становится слошком громозким, более оправдано что-то выносить вовне.
} | ||
|
||
[TestCase(1, 0, true, "0", TestName = "one digit")] | ||
[TestCase(3, 0, true, "123", TestName = "three digits")] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
У тебя тесткейсы где-то описывают полный набор параметор, а где-то нет. Можно выбрать один из приоритетов.
Все максимально перед глазами: пишем все параметры
Пишем только то, что сейчас важно: тогда такие параметры как onlyPositive и может быть размерности можно унести внутрь метода.
В общем, хорошо когда однообразно. Сделай как нравится, главное чтобы одинаково было.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Остались странные тесты
IsValidNumber_WithCorrectMinus_ReturnsTrue и IsValidNumber_WithCorrectPlus_ReturnsTrue, которые выбиваются из единообразия
New tests added
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В целом, молодец)
[TestCase(2, 0, true, "+1", TestName = "number with a plus")] | ||
[TestCase(3, 1, true, "+1.2", TestName = "number with a plus and separator dot")] | ||
[TestCase(3, 1, true, "+1,2", TestName = "number with a plus and separator comma")] | ||
public void IsValidNumber_WithCorrectPlus_ReturnsTrue( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
что именно проверяет этот тест?
ниже аналогичный IsValidNumber_WithCorrectMinus_ReturnsTrue тоже не понятен
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
То что именно плюсы и минусы корректно обрабатываются при подсчете intPart
} | ||
|
||
[TestCase(1, 0, true, "0", TestName = "one digit")] | ||
[TestCase(3, 0, true, "123", TestName = "three digits")] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Остались странные тесты
IsValidNumber_WithCorrectMinus_ReturnsTrue и IsValidNumber_WithCorrectPlus_ReturnsTrue, которые выбиваются из единообразия
[TestCase(3, 0, "123", TestName = "three digits")] | ||
[TestCase(3, 1, "12.3", TestName = "three digits with one number after the dot")] | ||
[TestCase(3, 2, "1.23", TestName = "three digits with two number after the dot")] | ||
public void IsValidNumber_WithCorrectNumberOfDigits_ReturnsTrue( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А в чем разница с IsValidNumber_WithCorrectPrecision_ReturnsTrue?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Идея была в том, чтобы в IsValidNumber_WithCorrectPrecision_ReturnsTrue проверять именно Precision без scale, а в IsValidNumber_WithCorrectNumberOfDigits_ReturnsTrue как бы комбинированная проверка
[TestCase(1, 0, "0", TestName = "one digit")] | ||
[TestCase(3, 0, "123", TestName = "three digits")] | ||
[TestCase(3, 1, "12.3", TestName = "three digits with one number after the dot")] | ||
[TestCase(3, 2, "1.23", TestName = "three digits with two number after the dot")] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Писать в названии количество цифр бессмысленно. Тесты - это документация, ты начинаешь утверждать, что если число из 3х цифр, то метод вернет true. Здесь лучше что-то типа: "number of digits match precision". В общем-то у тебя везде все названо хорошо, подгляди в соседний метод.
No description provided.