все .go-файлы в одном каталоге должны объявлять одно и то же имя пакета? [Дубликат]

Слово Гвидо находится в http://neopythonic.blogspot.co.uk/2009/04/tail-recursion-elimination.html

I недавно опубликовал запись в моем блоге истории Python о происхождении функциональных возможностей Python. Боковое замечание об отсутствии поддержки устранения хвостовой рекурсии (TRE) сразу вызвало несколько комментариев о том, что жаль, что Python этого не делает, включая ссылки на недавние записи в блоге другими, пытающимися «доказать», что TRE можно добавить в Python без труда. Поэтому позвольте мне защищать свою позицию (а это то, что я не хочу TRE на языке). Если вы хотите получить короткий ответ, это просто непитоносно. Вот длинный ответ:

57
задан Dan 10 August 2017 в 14:10
поделиться

3 ответа

Фундаментальное различие между тремя перечисленными вами стратегиями заключается в том, находится ли тестовый код в том же пакете, что и тестируемый код. Решение использовать package myfunc или package myfunc_test в тестовом файле зависит от того, хотите ли вы выполнить white-box или тестирование черного ящика .

Нет ничего плохого в использовании обоих методов в проекте. Например, вы могли бы иметь myfunc_whitebox_test.go и myfunx_blackbox_test.go.

Сравнение пакетов тестового кода

  • Тестирование черного ящика: используйте package myfunc_test, который гарантирует, что вы используете только экспортированные идентификаторы .
  • Тестирование белого ящика: используйте package myfunc, чтобы у вас был доступ к неэкспортированным идентификаторам.

Сравнение стратегий, перечисленных в вопросе

  • Стратегия 1: Файл myfunc_test.go использует package myfunc. В этом случае тестовый код в myfunc_test.go будет в том же пакете, что и код, протестированный в myfunc.go, который является myfunc в этом примере.
  • Стратегия 2: файл myfunc_test.go использует package myfunc_test - в этом случае тестовый код в myfunc_test.go "будет скомпилирован как отдельный пакет, а затем связан и запущен с основным тестовым двоичным кодом". [Источник: строки 58-59 в исходном коде test.go ]
  • Стратегия 3: файл myfunc_test.go использует package myfunc_test, но импортирует myfunc с использованием точечной нотации - Это вариант стратегии 2, но для импорта myfunc используется точечная нотация.
68
ответ дан Matthew Rankin 16 August 2018 в 04:02
поделиться
  • 1
    Следует отметить, что использование стратегии 1 также будет хранить файлы с _test.go отдельно от тестируемого пакета (такое же поведение, как и стратегия 2). Это не похоже на документацию за github.com/golang/go/issues/15315 – Kevin Deenanauth 9 May 2016 в 17:26
  • 2
    Исходная ссылка test.go нарушена – durp 6 December 2017 в 20:18

Вы должны использовать стратегию 1, когда это возможно. Вы можете использовать специальное имя пакета foo_test, чтобы избежать циклов импорта, но это в основном там, поэтому стандартную библиотеку можно протестировать с помощью того же механизма. Например, strings не может быть протестирован со стратегией 1, поскольку пакет testing зависит от strings. Как вы сказали, со стратегией 2 или 3 у вас нет доступа к частным идентификаторам пакета, поэтому обычно лучше не использовать его, если только вам не нужно.

14
ответ дан guelfey 16 August 2018 в 04:02
поделиться
  • 1
    Как не иметь доступ к частным идентификаторам в тестах, а не к достоинству? – jubobs 27 June 2018 в 17:26

Это зависит от объема ваших тестов. Тесты высокого уровня (интеграция, приемка и т. Д.), Вероятно, должны быть размещены в отдельном пакете, чтобы гарантировать, что вы используете пакет через экспортированный API.

Если у вас большой пакет с большим количеством внутренних компонентов, которые должны быть подвергнуты тестированию, затем используйте один и тот же пакет для своих тестов. Но это не приглашение для ваших тестов на доступ к любому частному состоянию. Это сделало бы рефакторинг кошмаром. Когда я пишу structs в go , я часто реализую интерфейсы. Это те методы интерфейса, которые я вызываю из своих тестов, а не все вспомогательные методы / функции по отдельности.

15
ответ дан mdwhatcott 16 August 2018 в 04:02
поделиться
Другие вопросы по тегам:

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