Куда идут юнит-тесты Python?

Я тоже был смущен. См. Этот пример ниже:

<Window x:Class="WpfApplicationWPF.CommandsWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CommandsWindow" Height="300" Width="300">

    <StackPanel>
        <Button Name="ButtonNew" 
                Click="ButtonNew_Click" 
                Background="{DynamicResource PinkBrush}">NEW</Button>
        <Image Name="ImageNew" 
               Source="pack://application:,,,/images/winter.jpg"></Image>
    </StackPanel>


    <Window.Background>
        <DynamicResource ResourceKey="PinkBrush"></DynamicResource>
    </Window.Background>

</Window>

Здесь я использовал динамический ресурс для кнопки и окна и не объявлял его нигде. На этапе выполнения будет проверен ResourceDictionary иерархии. Поскольку я не определил его , Я предполагаю, что будет использоваться значение по умолчанию.

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

private void ButtonNew_Click(object sender, RoutedEventArgs e)
{
    this.Resources.Add(  "PinkBrush"
                         ,new SolidColorBrush(SystemColors.DesktopColor)
                       );
}

Если они использовали StaticResource:

  • Ресурс должен быть объявлен в XAML
  • И это слишком «до» они используются ,

Надеюсь, я немного смутил.

446
задан Chen Levy 2 March 2010 в 12:33
поделиться

13 ответов

Обычная практика должна поместить тестовый каталог в тот же родительский каталог как Ваш модуль/пакет. Таким образом, если бы Ваш модуль назвали foo.py, то Ваше расположение каталога было бы похоже:

parent_dir/
  foo.py
  tests/

, Конечно, нет никакого способа сделать его. Вы могли также сделать тестовый подкаталог и импортировать модуль с помощью абсолютный импорт .

Везде, куда Вы помещаете свои тесты, я рекомендовал бы использовать нос для выполнения их. Нос перерывает Ваши каталоги для тестов. Таким образом, можно поместить тесты везде, где они имеют большую часть смысла организационно.

50
ответ дан Cristian 2 March 2010 в 12:33
поделиться

Для файла module.py модульный тест нужно обычно называть test_module.py, после соглашений о присвоении имен Pythonic.

существует несколько обычно принимаемых мест для помещения test_module.py:

  1. В том же каталоге как module.py.
  2. В ../tests/test_module.py (на том же уровне как каталог кода).
  3. В tests/test_module.py (один уровень в соответствии с каталогом кода).

я предпочитаю № 1 для его простоты нахождения тестов и импорта их. Независимо от того, что система сборки, которую Вы используете, может легко быть настроена для выполнения файлов, запускающихся с test_. На самом деле значение по умолчанию unittest шаблон, используемый для тестового открытия, test*.py .

186
ответ дан Cristian Ciupitu 2 March 2010 в 12:33
поделиться

Я недавно начал программировать в Python, таким образом, у меня действительно не было шанса узнать лучшую практику все же. Но, я записал модуль, который идет и находит все тесты и выполняет их.

Так, я имею:

app/
 appfile.py
test/
 appfileTest.py

я должен буду видеть, как это идет, в то время как я прогрессирую до больших проектов.

-2
ответ дан quamrana 2 March 2010 в 12:33
поделиться

В C# я обычно разделял тесты на отдельный блок.

В Python - до сих пор - я был склонен или писать doctests, где тест находится в docstring функции или поместил их в if __name__ == "__main__" блок у основания модуля.

1
ответ дан Blair Conrad 2 March 2010 в 12:33
поделиться

Когда запись пакета назвала "нечто", я помещу модульные тесты в отдельный пакет "foo_test". Модули и подпакеты будут тогда иметь то же имя как модуль пакета SUT. Например, тесты для модуля foo.x.y найдены в foo_test.x.y. __ init __. файлы py каждого пакета тестирования тогда содержат комплект AllTests, который включает все наборы тестов пакета. setuptools обеспечивает удобный способ определить основной пакет тестирования, так, чтобы после "Python setup.py разработали", можно просто использовать "Python setup.py тест", или "Python setup.py тестируют-s foo_test.x. SomeTestSuite" к справедливому определенный комплект.

0
ответ дан Sebastian Rittau 2 March 2010 в 12:33
поделиться

Я не полагаю, что существует установленная "лучшая практика".

я поместил свои тесты в другой каталог за пределами кода приложения. Я тогда добавляю каталог главного приложения к sys.path (разрешающий Вам импортировать модули отовсюду) в моем сценарии исполнителя тестов (который делает некоторый другой материал также) прежде, чем запустить все тесты. Таким образом, я никогда не должен удалять тестовый каталог из основного кода, когда я выпускаю его, экономя мне время и усилие, если очень крошечная сумма.

12
ответ дан dwestbrook 2 March 2010 в 12:33
поделиться

Мы используем

app/src/code.py

app/testing/code_test.py

app/docs/..

В каждом тестовом файле мы вставляем "../src /" в sys.path. Это не самое хорошее решение, но работы. Я думаю, что было бы замечательно, если бы кто-то подошел w/что-то как знаток в Java, который дает Вам стандартные соглашения, которые просто работают, неважно, какой проект Вы продолжаете работать.

2
ответ дан André 2 March 2010 в 12:33
поделиться

Я использую tests/ каталог, и затем импортирую модули главного приложения с помощью относительного импорта. Таким образом в MyApp/tests/foo.py, мог бы быть:

from .. import foo

для импорта MyApp.foo модуль.

14
ответ дан John Millikin 2 March 2010 в 12:33
поделиться

Я также склонен помещать свои модульные тесты в сам файл, как Jeremy Cantrell выше примечаний, хотя я склонен не помещать тестовую функцию в основную часть, а скорее помещают все в

if __name__ == '__main__':
   do tests...

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

я должен добавить, я склонен писать очень трудные модули/классы. Если бы Ваши модули требуют очень больших количеств тестов, можно поместить их в другого, но даже тогда, я все еще добавил бы:

if __name__ == '__main__':
   import tests.thisModule
   tests.thisModule.runtests

Это позволяет, кто-либо читающий Ваш исходный код знает, где искать тестовый код.

27
ответ дан Thomas Andrews 2 March 2010 в 12:33
поделиться

Я предпочитаю тестовый каталог верхнего уровня. Это действительно означает, что импорт становится немного более трудным. Для этого у меня есть два решения:

  1. Использование setuptools. Тогда Вы можете передать test_suite='tests.runalltests.suite' в setup() и можете запустить тесты просто: python setup.py test
  2. Набор PYTHONPATH при запущении тестов: PYTHONPATH=. python tests/runalltests.py

Вот то, как тот материал поддерживается кодом в M2Crypto:

, Если Вы предпочитаете запускать тесты с nosetests, Вы, возможно, должны были бы сделать что-то немного различное.

4
ответ дан bstpierre 2 March 2010 в 12:33
поделиться

Если тесты будут просты, просто поместите их в docstring - то большинство сред тестирования для Python сможет использовать это:

>>> import module
>>> module.method('test')
'testresult'

Для других более включенных тестов, я поместил их или в ../tests/test_module.py или в tests/test_module.py.

1
ответ дан 2 March 2010 в 22:33
поделиться

У нас был тот же вопрос при написании Pythoscope ( https://pypi.org/project/pythoscope/ ), который генерирует модульные тесты для программ на Python. Мы опрашивали людей на тестировании в списке Python, прежде чем мы выбрали каталог, было много разных мнений. В итоге мы решили поместить каталог «tests» в тот же каталог, что и исходный код. В этом каталоге мы генерируем тестовый файл для каждого модуля в родительском каталоге.

32
ответ дан 22 November 2019 в 22:55
поделиться

Как я это делаю...

Структура папок:

project/
    src/
        code.py
    tests/
    setup.py

Setup.py указывает на src/ как на место, содержащее модули моего проекта, затем я запускаю:

setup.py develop

Что добавляет мой проект в site-packages, указывая на мою рабочую копию. Для запуска тестов я использую:

setup.py tests

Используя любой настроенный мною тестовый бегунок.

7
ответ дан 22 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

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