Си диез / Говнокод #12260 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
var usr = Enumerable.Range(1, 1) 
	.Select(id => new User(1, "FooBar", "desc" + 1, DateTime.UtcNow)) 
	.ToReadonly() 
	.GetRandomElement();

Из юнит-теста. Копипаста рождает чудовищ.

Запостил: VasyaMatros VasyaMatros, (Updated )

Комментарии (64) RSS

  • Получили список только для чтения из юзеров с одним элементом. в чем суть? В каких условиях это родлось? пахнет синтетикой
    Ответить
    • Это вариация того, что имело смысл.
      Тесты используют в качестве источника данных ин-мемори рид-онли коллекции и выбирают оттуда рандомом. Кому-то захотелось кастома, герой скопипастил кусок кода из стора, подкрутил согласно нуждам и, вероятно, был очень доволен, что цель достигнута без применения мозга.
      Ответить
      • я конечно не знаю обстоятельств этого конкретного кода, но поверь мне: уже после кодирования первых сотен тест-кейсов, мозги отключаются сами по себе. бо не выдерживают. monkey coding for code monkey.

        а после еще пары тысяч вывереных тест-кэйсов приходит и просвещение: копи-паст это очень хорошо, все руками писать - плохо. потому что копи-пастом меньше глупых очепяток делается. и если находится ошибка, то ее простой заменой в редакторе можно пофиксить - сразу во всех тест-кэйсах.
        Ответить
        • >потому что копи-пастом меньше глупых очепяток делается
          Проблема не в опечатках, а в "недопечатках", когда пропускаешь места, где нужно внести изменения. И именно поэтому нужно не копипастить, а выделять похожие участки кода в отдельные функции/классы.

          DRY, motherfucker!
          Ответить
          • > Проблема не в опечатках, а в "недопечатках", когда пропускаешь места, где нужно внести изменения.

            Это значит вы неправильно копипастите.

            Шучу, случается. 🙂

            > И именно поэтому нужно не копипастить, а выделять похожие участки кода в отдельные функции/классы.

            Применение традиционных методов хорошего программирования (продуманый дезайн, правильно модулировано, хорошо структурировано) к тест-кэйсам имеет один убийственных недостаток: реализация тест становится сложным, и требует своего собственного теста. Тупая структура тест кэйсов есть часто желаемый эффект, что бы не уподоблятся тестируемой программе.

            Ну да я думаю у каждого опыт свой.
            Ответить
            • Правильная методика как всегда в середине между противоположными мнениями.
              Ответить
            • >реализация тест становится сложным

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

              И, кстати, сложные тесты могут быть признаком сложного кода - если код состоит из огромных кусков, то и тесты будут такими же. Для этого и придумали CRAP-метрику.
              http://googletesting.blogspot.ru/2011/02/this-code-is-crap.html

              При тестировании в PHP на PHPUnit меня больше всего убивает не сложность тестов, а непродуманность языка - нужно перед каждым вызовом метода писать `$this->`, что очень визуально засоряет код.
              Ответить
          • >копи-паст это очень хорошо
            В тестах реально много копипаста, без которого будет хуже.

            >И именно поэтому нужно не копипастить, а выделять похожие участки кода в отдельные функции/классы.
            "Заменить 20 строк копипасты 40 строками разного кода".
            А еще на отдельные функции/классы тоже нужно написать тест.
            Ответить
            • А потом писать юнит-тест для юнит-теста тестирующего юнит-тесты... Уж лучше тупой и понятный копипаст, чем это.
              Ответить
            • Хз, я не знаю, у меня тесты сами по себе получаются, либо во время непосредственно написания (из черновиков), либо после обнаружения багов. А в других случаях - я даже не знаю... тесты на покрытие могут наверное занимать и много времени и принуждать к копипасте, а юнит тесты подтверждающие работоспособность - с чего бы?
              Ответить
          • Вот например junit сам по себе говно, понуждающее к копипасте.
            assertTrue(a);
            assertTrue(b);
            assertFalse(!c);
            assertNoNull(d);
            assertTrue(e);
            assertFalse(f);
            assertSame(g,h);

            Я написал себе хелпер-метод, который принимает vararg и радуюсь:
            assertTru(a,b,c,d!=null,e,f,g==h);
            Это пример, доработки, казалось бы известного, широкоиспользуемого фреймворка.
            Но есть случаи где так просто копипасту не обойдешь
            Ответить
            • > assertTru(a,b,c,d!=null,e,f,g==h);
              Есть проблема в таком подходе - на первый взгляд сложно понять, что же именно сломалось. Хорошо, если assertTru возвращает номер упавшего условия, но иногда он может просто не успеть этого сделать: assertTru(x != null, x.getAttr() == 5); легко может грохнуться с NPE.

              Мне нравится подход property-based testing, реализованный, например, в QuickCheck. Но его, к сожалению, не всегда приемлимо применять.
              Ответить
              • >assertTru возвращает номер упавшего условия
                Само собой.
                >x.getAttr() == 5
                Ну всегда можно завести int.
                Ответить
              • >assertTru(x != null, x.getAttr() == 5); легко может грохнуться с NPE.
                assertTru(()=>x != null, ()=>x.getAttr() == 5);
                Ответить
  • ХЗ. Меня больше смущает то, как тестировать random(). Ну тут еще ладно, можно легко перебрать все значения. А вот кавередж тест написать для рандома, который, например, double генерирует... вот это круто было бы.
    Ответить
  • Это чё, ЛИНКВ над списком из 1 элемента? Ништяк!
    Ответить
    • "Линк". В слове "LINQ" нету буквы "вэ"
      Ответить
        • Пришел почитать про linq

          Кстати, linq это прикольно. Такой как-бы декларативный язык для выбора всякого говна из енумераблов, но при этом статически типизированный
          Ответить
          • SQL так то тоже статически типизированный. Если бы не всякие отбросы в духе "MySQL" да "SQLite", которые превратили его в подобие "PHP"...
            Ответить
            • Мапинг его в твой код проебывает типы (ORM всмысле их проебывает) если не генерить специальные прокси классы
              Ответить
              • Именно поэтому я за беркли дб. Там нет никаких "маппингов", "типов" и "полей".
                Ответить
                • Помнишь функцию ``tie`` в перле?:)

                  Только беркли это кивалуе а не реляционка
                  Ответить
            • а что там с сикулайтом? можно температуру на дату помножить?
              Ответить
              • В «Сикулайте» нет вообще никакой даты. Именно поэтому я за «Сикулайт»:
                https://www.sqlite.org/datatype3.html

                SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:

                • TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
                • REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
                • INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
                Ответить
                • риальне, я уже и забыл

                  полез проверить один свой проектик, а там вот это вот всё
                  Ответить
              • Там можно пихать строку в колонку для чисел... Ему вообще насрать на типы.
                Ответить
              • "MySQL" родился как недобаза для тех, кто слишком глуп, чтобы освоить настоящую СУБД.

                Так и развивается
                Ответить
                • Я тут кстати открыл для себя «compose key» (подразумевается софтверный ремаппинг любой ненужной клавиши, соответствующая настройка есть в панели управления любого DE, а кого она там реально под капотом конфигурирует, я и не знаю). Ну так вот, если раньше хром какое-то время поддерживал ctrl + shift + u, либо мне приснилось такое (но вроде я давно на всех дистрибутивах на кедах без ibus), и я даже запомнил 00AB и 00BB и был некоторое время убежден, что я достиг счастья, то теперь я просто жму «compose key», два раза отбиваю угловую скобку и теку.
                  Ответить
                  • > Я тут кстати открыл для себя «compose key»

                    Бедного Fike заперли, и чтобы ему выбраться, пришлось освоить какой-то ключ…. (( owo
                    Ответить
                  • Поздравляю:)

                    Иксы поддерживали компост когда еще даже kbd не было, а был один сраный xmodmap (да пребудет он на хую вечно!)

                    Странно, что ты только открыл
                    Ответить
                  • а ничего, что внешний вид женщин постоянно коментировался?

                    ничего, что женщин лапали сотрудники мужского пола?

                    нормально, что руководители приставали к женщинам?

                    а может нормально, то что одна сотрудница покончила с собой после мероприятий компании, где подверглась "харасменту"?
                    Ответить
  • Я не оригинален, но AssParallel бы добавил пикантности тесту.
    Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8