Альтернативы мерзавца “svn информация”, которая может быть включена в сборку для трассируемости?

Вы хотите метод сжатия:

str.squeeze([other_str]*) → new_str
Builds a set of characters from the other_str parameter(s) using the procedure described for String#count. Returns a new string where runs of the same character that occur in this set are replaced by a single character. If no arguments are given, all runs of identical characters are replaced by a single character.

   "yellow moon".squeeze                  #=> "yelow mon"
   "  now   is  the".squeeze(" ")         #=> " now is the"
   "putters shoot balls".squeeze("m-z")   #=> "puters shot balls"
46
задан Peter Mortensen 25 July 2018 в 07:25
поделиться

4 ответа

Tips:

Avoid writing procedural code

Tests can be a bear to maintain if they're written against procedural-style code that relies heavily on global state or lies deep in the body of an ugly method. Если вы пишете код на объектно-ориентированном языке, эффективно используйте объектно-ориентированные конструкции , чтобы уменьшить это.

  • Избегайте глобального состояния, если это вообще возможно.
  • Избегайте статики, поскольку они имеют тенденцию распространяться по вашей кодовой базе и в конечном итоге приводят к тому, что вещи становятся статичными, чего не должно быть Они также раздувают ваш тестовый контекст (см. Ниже).
  • Эффективно использовать полиморфизм для предотвращения чрезмерных if и флагов

Найдите, какие изменения, инкапсулируйте и отделите от того, что остается прежним.

Есть дросселирование точки кода, которые меняются намного чаще, чем другие части. Сделайте это в своей кодовой базе, и ваши тесты станут более здоровыми.

  • Хорошая инкапсуляция ведет к хорошим, слабосвязанным проектам.
  • Рефакторинг и модульность.
  • Делайте тесты небольшими и сфокусированными.

Чем больше окружающий контекст тест, Они позволяют устранить дублирование в тестах, предоставляя вам более детализированные крючки в жизненном цикле теста.
  • Изучите, используя тестовые двойники (моки, подделки, заглушки), чтобы уменьшить размер контекста теста.
  • Исследуйте Шаблон построителя тестовых данных .
  • Удалите дублирование из тестов, но убедитесь, что они сохраняют фокус.

    Вы, вероятно, не сможете удалить все дублирование, но все же попытайтесь удалить его там, где оно вызывает боль. Убедитесь, что вы не удалили столько дубликатов, чтобы кто-то не смог прийти и сразу сказать, что делает тест. (См. Статью Пола Уитона "Evil Unit Tests" для альтернативного объяснения той же концепции.)

    • Никто не захочет исправлять тест, если не может понять, что он делает.
    • ] Следуйте шаблону «Аранжировка, действие, утверждение».
    • Используйте только одно утверждение для каждого теста.

    Тестируйте на уровне, соответствующем тому, что вы пытаетесь проверить.

    Подумайте о сложности Selenium-теста с записью и воспроизведением и о том, что может измениться под вашим руководством. по сравнению с тестированием одного метода.

    • Изолируйте зависимости друг от друга.
    • Используйте внедрение зависимостей / инверсию управления.
    • Используйте тестовые двойники для инициализации объекта для тестирования и убедитесь, что вы тестируете отдельные блоки кода изолированно.
    • Убедитесь, что вы пишете соответствующие тесты
      • «Освободите ловушку», намеренно введя ошибку и убедившись, что она будет обнаружена тестом.
    • См. Также: Интеграционные тесты - это мошенничество

    Знайте, когда использовать на основе состояния или на основе взаимодействия Тестирование

    Истинные модульные тесты нуждаются в истинной изоляции. Модульные тесты не попадают в базу данных или открытые сокеты. Прекратите насмехаться над этими взаимодействиями. Убедитесь, что вы правильно разговариваете со своими соавторами, а не то, что правильным результатом вызова этого метода было «42».

    Демонстрация кода тестового вождения

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

    • Попробуйте это упражнение: например, этот (уже упоминалось там )

      #!/bin/bash
      
      # author: Duane Johnson
      # email: duane.johnson@gmail.com
      # date: 2008 Jun 12
      # license: MIT
      # 
      # Based on discussion at http://kerneltrap.org/mailarchive/git/2007/11/12/406496
      
      pushd . >/dev/null
      
      # Find base of git directory
      while [ ! -d .git ] && [ ! `pwd` = "/" ]; do cd ..; done
      
      # Show various information about this git directory
      if [ -d .git ]; then
        echo "== Remote URL: `git remote -v`"
      
        echo "== Remote Branches: "
        git branch -r
        echo
      
        echo "== Local Branches:"
        git branch
        echo
      
        echo "== Configuration (.git/config)"
        cat .git/config
        echo
      
        echo "== Most Recent Commit"
        git log --max-count=1
        echo
      
        echo "Type 'git log' for more commits, or 'git show' for full commit details."
      else
        echo "Not a git repository."
      fi
      
      popd >/dev/null
      

      В результате получается что-то вроде:

      == Remote URL: origin git@github.com:canadaduane/my-project.git
      == Remote Branches:
        origin/work
        trunk
        trunk@1309
        trunk@2570
        trunk@8
      
      == Local Branches:
        master
      * work
      
      == Configuration (.git/config)
      [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
      [svn-remote "svn"]
        url = svn+ssh://svn.my-project.com/srv/svn
        fetch = my-project/trunk:refs/remotes/trunk
      [remote "origin"]
        url = git@github.com:canadaduane/my-project.git
        fetch = refs/heads/*:refs/remotes/origin/*
      [github]
        user = canadaduane
        repo = my-project
      
      == Most Recent Commit
      commit b47dce8b4102faf1cedc8aa3554cb58d76e0cbc1
      Author: Duane Johnson <duane.johnson@gmail.com>
      Date:   Wed Jun 11 17:00:33 2008 -0600
      
          Added changes to database schema that will allow decentralization from content pointers table
      
      type 'git log' for more, or 'git show' for full commit details.
      
    28
    ответ дан 26 November 2019 в 20:11
    поделиться
    git describe
    

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

    3
    ответ дан 26 November 2019 в 20:11
    поделиться

    В git идентификатор фиксации уникален в проекте даже для распределенного кода. Вы также можете проверить идентификатор фиксации, поэтому, если вам нужен идентификатор, который позволит вам вернуться к состоянию кода, который сгенерировал сборку, вам просто нужен идентификатор фиксации.

    git rev-parse HEAD
    

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

    git diff --name-status HEAD
    

    или просто используйте код выхода:

    git diff --quiet HEAD
    

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

    Если у вас есть центральный главный репозиторий, вы можете записать его URL, хотя как идентификатор фиксации уникален для всех клонов проекта.

    9
    ответ дан 26 November 2019 в 20:11
    поделиться

    Я не знаю, хотите ли вы этого, но если вы хотите встроить какую-либо информацию о версии во время сборки, отметьте свои выпуски точек и посмотрите, как сам Git делает это (ядро Linux использует тот же механизм) с помощью Makefile и GIT-VERSION-GEN скрипта (обе ссылки на gitweb в repo.or.cz) .

    GIT-VERSION-GEN, в свою очередь, использует git-describe .

    2
    ответ дан 26 November 2019 в 20:11
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: