Skip to content
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

Open
wants to merge 10 commits into
base: master
Choose a base branch
from

Conversation

Dary0302
Copy link

@Dary0302 Dary0302 commented Nov 4, 2024

No description provided.

Copy link

@Buskervil Buskervil left a 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);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь ассерт забыл. Должно быть что-то типа Should().BeTrue() или тому подобное, в зависимости от того, что ты хочешь проверить.

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")]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я бы предложил сгруппировать тест-кейсы по категориям и отобразить это на уровне методов (разные методы сделать для разных проверок) и на уровне названий (TestName отражает суть проверки, а не перечисляет входные параметры). У тебя так сделано для тестов на конструктор.

Так будет более структурировано, и читать такие тесты будет гораздо легче 🙂

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)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У тестов на конструктор имена не очень удались. Лучше что-нибудь типа
Contructor_WithIncorrectPrecision_Throws (по принципу Что_ПриКакихУсловиях_КакойРезультат)

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));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ага, а если будет 3 поколения, будет работать?

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.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ага, все так

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved

Copy link

@Buskervil Buskervil left a 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)));

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)

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(

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);

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")]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У тебя тесткейсы где-то описывают полный набор параметор, а где-то нет. Можно выбрать один из приоритетов.
Все максимально перед глазами: пишем все параметры
Пишем только то, что сейчас важно: тогда такие параметры как onlyPositive и может быть размерности можно унести внутрь метода.

В общем, хорошо когда однообразно. Сделай как нравится, главное чтобы одинаково было.

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, которые выбиваются из единообразия

Copy link

@Buskervil Buskervil left a 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(

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

что именно проверяет этот тест?
ниже аналогичный IsValidNumber_WithCorrectMinus_ReturnsTrue тоже не понятен

Copy link
Author

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")]

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(

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А в чем разница с IsValidNumber_WithCorrectPrecision_ReturnsTrue?

Copy link
Author

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")]

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". В общем-то у тебя везде все названо хорошо, подгляди в соседний метод.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants