Слово Гвидо находится в http://neopythonic.blogspot.co.uk/2009/04/tail-recursion-elimination.html
I недавно опубликовал запись в моем блоге истории Python о происхождении функциональных возможностей Python. Боковое замечание об отсутствии поддержки устранения хвостовой рекурсии (TRE) сразу вызвало несколько комментариев о том, что жаль, что Python этого не делает, включая ссылки на недавние записи в блоге другими, пытающимися «доказать», что TRE можно добавить в Python без труда. Поэтому позвольте мне защищать свою позицию (а это то, что я не хочу TRE на языке). Если вы хотите получить короткий ответ, это просто непитоносно. Вот длинный ответ:
Фундаментальное различие между тремя перечисленными вами стратегиями заключается в том, находится ли тестовый код в том же пакете, что и тестируемый код. Решение использовать package myfunc
или package myfunc_test
в тестовом файле зависит от того, хотите ли вы выполнить white-box или тестирование черного ящика .
Нет ничего плохого в использовании обоих методов в проекте. Например, вы могли бы иметь myfunc_whitebox_test.go
и myfunx_blackbox_test.go
.
package myfunc_test
, который гарантирует, что вы используете только экспортированные идентификаторы . package myfunc
, чтобы у вас был доступ к неэкспортированным идентификаторам. myfunc_test.go
использует package myfunc
. В этом случае тестовый код в myfunc_test.go
будет в том же пакете, что и код, протестированный в myfunc.go
, который является myfunc
в этом примере. myfunc_test.go
использует package myfunc_test
- в этом случае тестовый код в myfunc_test.go
"будет скомпилирован как отдельный пакет, а затем связан и запущен с основным тестовым двоичным кодом". [Источник: строки 58-59 в исходном коде test.go ] myfunc_test.go
использует package myfunc_test
, но импортирует myfunc
с использованием точечной нотации - Это вариант стратегии 2, но для импорта myfunc
используется точечная нотация. Вы должны использовать стратегию 1, когда это возможно. Вы можете использовать специальное имя пакета foo_test
, чтобы избежать циклов импорта, но это в основном там, поэтому стандартную библиотеку можно протестировать с помощью того же механизма. Например, strings
не может быть протестирован со стратегией 1, поскольку пакет testing
зависит от strings
. Как вы сказали, со стратегией 2 или 3 у вас нет доступа к частным идентификаторам пакета, поэтому обычно лучше не использовать его, если только вам не нужно.
Это зависит от объема ваших тестов. Тесты высокого уровня (интеграция, приемка и т. Д.), Вероятно, должны быть размещены в отдельном пакете, чтобы гарантировать, что вы используете пакет через экспортированный API.
Если у вас большой пакет с большим количеством внутренних компонентов, которые должны быть подвергнуты тестированию, затем используйте один и тот же пакет для своих тестов. Но это не приглашение для ваших тестов на доступ к любому частному состоянию. Это сделало бы рефакторинг кошмаром. Когда я пишу structs в go , я часто реализую интерфейсы. Это те методы интерфейса, которые я вызываю из своих тестов, а не все вспомогательные методы / функции по отдельности.
_test.go
отдельно от тестируемого пакета (такое же поведение, как и стратегия 2). Это не похоже на документацию за github.com/golang/go/issues/15315 – Kevin Deenanauth 9 May 2016 в 17:26