1. C# / Говнокод #12260

    +102

    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, 08 Декабря 2012

    Комментарии (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. Соответствие распределения значений желаемому (обычно равномерное) - на достаточно большой выборке оно должно стремиться к идеальному
        2. Независимость генерируемых значений друг от друга
        3. Независимость от внешних факторов (кроме входного значения для ГПСЧ)
        и т.п.

        Общее правило: для вероятностных функций пишутся вероятностные тесты.
        Ответить
    • Это чё, ЛИНКВ над списком из 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»?
                Ответить
              • > превратили
                Нет, "MySQL" таким родился
                Ответить
                • "MySQL" родился как недобаза для тех, кто слишком глуп, чтобы освоить настоящую СУБД.

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

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

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

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

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

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

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

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