Skip to content

Зубков Артём ДЗ №1#55

Open
artem7841 wants to merge 14 commits intokontur-courses:masterfrom
artem7841:master
Open

Зубков Артём ДЗ №1#55
artem7841 wants to merge 14 commits intokontur-courses:masterfrom
artem7841:master

Conversation

@artem7841
Copy link

No description provided.

Copy link

@Yrwlcm Yrwlcm left a comment

Choose a reason for hiding this comment

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

В целом сценарии для тестов написаны неплохо, только их надо прибрать и покрасивее написать.

Также нужно убрать все лишние файлы, которые закоммитил. И сейчас придираться не буду, т.к. первая домашка, но в будущих заданиях нужно стоит делить коммиты по смыслу и давать им говорящее название по содержанию.

По идее по регламенту если история коммитов плохая (непонятные названия, или в одном коммите все сделано), то домашка не проверяется, пока не поправишь

Comment on lines 44 to 48
actualTsar.Should().BeEquivalentTo(expectedTsar, options =>
options
.Excluding(p => p.Id)
.Excluding(p => p.Parent.Id)
);
Copy link

@Yrwlcm Yrwlcm Oct 29, 2025

Choose a reason for hiding this comment

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

В целом решение правильное. Но что если цари будут отличаться внуками, или правнуками и т.д? Всех через .Parent.Parent.Parent... не переберёшь) С этим может помочь другая перегрузка метода Excluding, которая принимает IMemberInfo и шарповый оператор nameof

Comment on lines +49 to +53
// Тест с FluentAssertions имеет следующие приемущества:
// 1) Автоматически расширяется при добавлении новых свойств в класс Person
// 2) Лучшая читаемость кода
// 3) При ошибке видно сразу каке свойтво не совпало, например если изменить возраст в expectedTsar вывод будет содержать "Expected field actualTsar.Age to be 53, but found 54."
// а при Assert "Assert.That(actual, Is.EqualTo(expected)) Expected: 54 But was: 53" - не понятно какое именно свойтво провалило тест
Copy link

Choose a reason for hiding this comment

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

Тут все верно, но у кастмного решения есть еще проблема с рекурсией, там она потенциально бесконечная. У FluentAssertions есть ограничение по глубине рекурсии

Comment on lines 13 to 29
Assert.Throws<ArgumentException>(() => new NumberValidator(-1, 2, true));
Assert.DoesNotThrow(() => new NumberValidator(1, 0, true));
Assert.Throws<ArgumentException>(() => new NumberValidator(-1, 2, false));
Assert.DoesNotThrow(() => new NumberValidator(1, 0, true));
Assert.DoesNotThrow(() => new NumberValidator(1, 0, true)); // Дублирует 2 проверку

ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0"));
ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); // Дублирует 3 проверку
ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0"));
ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0"));
ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("00.00"));
ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("-0.00"));
ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0"));
ClassicAssert.IsTrue(new NumberValidator(17, 2, true).IsValidNumber("0.0")); // Дублирует 3 проверку
ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("+0.00"));
ClassicAssert.IsTrue(new NumberValidator(4, 2, true).IsValidNumber("+1.23"));
ClassicAssert.IsFalse(new NumberValidator(3, 2, true).IsValidNumber("+1.23"));
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"));
Copy link

Choose a reason for hiding this comment

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

Старые тесты стоит удалить, мы же их в новые переделали

Comment on lines 34 to 40
// Было изменено:
// 1) Тесты были разделены на логические группы для лучшей читаемости
// 2) Были добалены сообщения к каждому тесту чтобы из стек-трейса было понятно на каких данных тест не работает
// 3) Использован Assert.Multiple() для того чтобы одна упавшая проверка не блокировала прохождение остальных проверок
// 4) Удалены дублирующиеся тесты
// 5) Добавлены тесты проверяющие: пограничные значения на scale и precision, параметр onlyPositive=false, пустую строку и null, запятую в качетве разделителя,
// некоректные форматы чисел (2 точки; число начинается с точки; без дробной части, но с точкой), отрицательный ноль.
Copy link

Choose a reason for hiding this comment

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

Спасибо, что подсветил по какой логике делал, но целом такие комменты, даже в домашках, лучше не писать :) Допустимо в случае, когда как в первой части задания явно просили обосновать

Твои изменения видны с помощью гита. А если приходится объяснять свой код комментами, в 90% случаев что-то пошло не так и код надо отрефакторить

А если насчет чего-то будешь сомневаться, то такие вещи можно на ревью подсвечивать как раз в пулреквестах, оставляя свой коммент. Ну или в рамках шпоры в личку наставнику

public class NumberValidatorTestsFix
{
[Test]
public void КонструкторКорректноВалидируетПараметры()
Copy link

Choose a reason for hiding this comment

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

Писать названия в коде не на английском - плохой тон, есть переводчики и нейросети, если не получается придумать как назвать. И еще у вас в лекции (в презентации) есть про конвенты именования тестов их тоже нужно посмотреть и поправить все названия тестов

{
var validator = new NumberValidator(17, 2, true);

Assert.Multiple(() =>
Copy link

Choose a reason for hiding this comment

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

Все Assert.Multiple стоит заменить на [TestCase]

Assert.That(strictValidator.IsValidNumber("0.12"), Is.True, "Граница scale");

// Превышение лимитов
Assert.That(strictValidator.IsValidNumber("12.34"), Is.False, "Превышение precision");
Copy link

Choose a reason for hiding this comment

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

Тест который проверяет превышение precision уже был, этот нужно удалить

}

[Test]
public void IsValidNumberКорректноРаботаетСРежимомOnlyPositive()
Copy link

Choose a reason for hiding this comment

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

Очень странная группировка тестов, название говорит, что СРежимомOnlyPositive а внутри 3 из 4 тестов anyNum 🤔

Comment on lines 122 to 124
Assert.That(validator.IsValidNumber("12..34"), Is.False, "Две точки");
Assert.That(validator.IsValidNumber(".123"), Is.False, "Начинается с точки");
Assert.That(validator.IsValidNumber("123."), Is.False, "Оканчивается точкой");
Copy link

Choose a reason for hiding this comment

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

// 5) Добавлены тесты проверяющие: пограничные значения на scale и precision, параметр onlyPositive=false, пустую строку и null, запятую в качетве разделителя,

Где-то потерялся тест на запятую)

Copy link

Choose a reason for hiding this comment

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

Вот это точно лишний файл, который не стоит коммитить, как и все файлы из .idea/

Copy link

@Yrwlcm Yrwlcm left a comment

Choose a reason for hiding this comment

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

Сейчас ты тоже ударился в другую крайность, коммит почти на каждое изменение. У нас тут 2 файлика, а уже 12 коммитов, так тоже делать не стоит)

С опытом придет понимание/привычка как это правильней разбивать. Например в этой задачке с моей точки зрения идеально можно было разбить на коммиты так:

  1. Перевел CheckCurrentTsar на FluentAssertions
  2. Прибрался в тестах NumberValidatorTests
  3. Правки после ревью (либо разделить его на два коммита, правки CheckCurrentTsar и правки NumberValidatorTests)

Comment on lines 45 to 50
actualTsar.Should().BeEquivalentTo(expectedTsar, options =>
options
.Excluding(p => p.Id)
.Excluding((IMemberInfo p) =>
p.Name == "Id" &&
p.Path.Contains("Parent"))
Copy link

Choose a reason for hiding this comment

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

Что-то ты перемудрил) Нам же достаточно через IMemberInfo исключить поле Id по названию, а будет оно в изначальном Person или во вложенном, уже не важно.

В итоге у нас будет один Excluding и без проверки на Parent в пути. И еще воспользуйся nameof, так зашивать строчки, тоже не очень хорошо)


[TestFixture]
public class NumberValidatorTests
public class NumberValidatorTestsFix
Copy link

Choose a reason for hiding this comment

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

Fix точно лишнее в названии, у нас ведь это всё те же тесты

Comment on lines 12 to 14
[TestCase(-1, 2)]
[TestCase(5, -1)]
[TestCase(5, 6)]
Copy link

Choose a reason for hiding this comment

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

Тут не хватает названия для теста, почему именно эти параметры должны выкидывать исключение, также как в других тестах, Отрицательная точность и т.п.

Comment on lines 58 to 64
[TestCase("123.4", "Превышение precision в целой части")]
public void IsValidNumber_WithExceededPrecisionAndScale_ReturnsFalse(string number, string description)
{
var strictValidator = new NumberValidator(3, 2);

strictValidator.IsValidNumber(number).Should().BeFalse(description);
}
Copy link

Choose a reason for hiding this comment

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

У нас уже есть похожие тесты в группе IsValidNumber_WithInvalidNumberFormats_ReturnsFalse перенеси этот туда

Comment on lines 67 to 72
public void IsValidNumber_WithOnlyPositiveTrue_RejectsNegativeNumbers()
{
var positiveOnly = new NumberValidator(5, 2, true);

positiveOnly.IsValidNumber("-1.23").Should().BeFalse("Только положительные: отрицательное число");
}
Copy link

Choose a reason for hiding this comment

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

Такой тест уже есть

Comment on lines 80 to 81
anyNum.IsValidNumber("+1.23").Should().BeTrue("Положительное число с плюсом");
anyNum.IsValidNumber("1.23").Should().BeTrue("Положительное число без плюсом");
Copy link

Choose a reason for hiding this comment

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

Эти два сценария уже тестируются в IsValidNumber_WithValidNumberFormats_ReturnsTrue. И перепиши на [TestCase]

Comment on lines 97 to 102
[TestCase("12,34", "Запятая в качестве разделителя")]
public void IsValidNumber_WithCommaAsSeparator_ReturnsTrue(string number, string description)
{
var validator = new NumberValidator(10, 2);

validator.IsValidNumber(number).Should().BeTrue(description);
Copy link

Choose a reason for hiding this comment

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

У нас же есть группа тестов про валидные форматы IsValidNumber_WithValidNumberFormats_ReturnsTrue, чем этот от них отличается что мы его в отдельную группу вынесли?)

[TestCase("1.23", "Максимальная precision и scale")]
[TestCase("12.3", "Граница precision")]
[TestCase("0.12", "Граница scale")]
[TestCase("1,23", "Запятая в качестве разделителя")]
Copy link

Choose a reason for hiding this comment

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

Этот тест с запятой все таки должен лежать в группе WithValidNumberFormats потому что по смыслу как раз туда подходит, а не в WithValidPrecisionAndScale

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