Вы хотите метод сжатия:
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"
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. Если вы пишете код на объектно-ориентированном языке, эффективно используйте объектно-ориентированные конструкции , чтобы уменьшить это.
Есть дросселирование точки кода, которые меняются намного чаще, чем другие части. Сделайте это в своей кодовой базе, и ваши тесты станут более здоровыми.
Вы, вероятно, не сможете удалить все дублирование, но все же попытайтесь удалить его там, где оно вызывает боль. Убедитесь, что вы не удалили столько дубликатов, чтобы кто-то не смог прийти и сразу сказать, что делает тест. (См. Статью Пола Уитона "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.
git describe
- это все, что вам нужно. Просто убедитесь, что вы создали хотя бы один (правильный) тег.
В git идентификатор фиксации уникален в проекте даже для распределенного кода. Вы также можете проверить идентификатор фиксации, поэтому, если вам нужен идентификатор, который позволит вам вернуться к состоянию кода, который сгенерировал сборку, вам просто нужен идентификатор фиксации.
git rev-parse HEAD
Конечно, вы, вероятно, захотите быть уверены что в рабочем дереве или индексе нет ожидающих изменений, поэтому вы можете проверить, нет ли вывода на что-то вроде этого:
git diff --name-status HEAD
или просто используйте код выхода:
git diff --quiet HEAD
Единственное, что вы можете захотеть Для записи о машине сборки используются факторы окружающей среды, такие как версии цепочки инструментов и состояние любых инструментов, которые не были получены из репозитория.
Если у вас есть центральный главный репозиторий, вы можете записать его URL, хотя как идентификатор фиксации уникален для всех клонов проекта.
Я не знаю, хотите ли вы этого, но если вы хотите встроить какую-либо информацию о версии во время сборки, отметьте свои выпуски точек и посмотрите, как сам Git делает это (ядро Linux использует тот же механизм) с помощью Makefile и GIT-VERSION-GEN скрипта (обе ссылки на gitweb в repo.or.cz) .
GIT-VERSION-GEN, в свою очередь, использует git-describe .