Я бы предложил перенести всю логику выполнения теста в сценарий установки.
с использованием test
команды
Прежде всего, setuptools
отправляет команду test
, поэтомуВы можете запустить тесты через python setup.py test
.Более того, test
вызывает команду build_ext
под капотом и размещает встроенные расширения так, чтобы они были доступны в тестах, поэтому вам не нужно явно вызывать python setup.py build_ext
:
$ python setup.py test
running test
running egg_info
creating so.egg-info
writing so.egg-info/PKG-INFO
writing dependency_links to so.egg-info/dependency_links.txt
writing top-level names to so.egg-info/top_level.txt
writing manifest file 'so.egg-info/SOURCES.txt'
reading manifest file 'so.egg-info/SOURCES.txt'
writing manifest file 'so.egg-info/SOURCES.txt'
running build_ext
building 'wrap_fib' extension
creating build
creating build/temp.linux-aarch64-3.6
aarch64-unknown-linux-gnu-gcc -pthread -fPIC -I/data/gentoo64/usr/include/python3.6m -c wrap_fib.c -o build/temp.linux-aarch64-3.6/wrap_fib.o
aarch64-unknown-linux-gnu-gcc -pthread -fPIC -I/data/gentoo64/usr/include/python3.6m -c cfib.c -o build/temp.linux-aarch64-3.6/cfib.o
creating build/lib.linux-aarch64-3.6
aarch64-unknown-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,--as-needed -L. build/temp.linux-aarch64-3.6/wrap_fib.o build/temp.linux-aarch64-3.6/cfib.o -L/data/gentoo64/usr/lib64 -lpython3.6m -o build/lib.linux-aarch64-3.6/wrap_fib.cpython-36m-aarch64-linux-gnu.so
copying build/lib.linux-aarch64-3.6/wrap_fib.cpython-36m-aarch64-linux-gnu.so ->
test_fib_0 (test_fib.FibonacciTests) ... ok
test_fib_1 (test_fib.FibonacciTests) ... ok
test_fib_10 (test_fib.FibonacciTests) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.002s
OK
(Я использовал код из репозитория примеров Cython Book для игры, но результат должен быть очень похож на то, что производит PyBind).
с использованием дополнительных ключевых слов
ДругойОсобенностью, которая может пригодиться, являются дополнительные ключевые слова, которые setuptools
добавляет: test_suite
, tests_require
, test_loader
( документы ).Вот пример встраивания пользовательского набора тестов, как вы делаете в run_tests.py
:
# setup.py
import unittest
from Cython.Build import cythonize
from setuptools import setup, Extension
exts = cythonize([Extension("wrap_fib", sources=["cfib.c", "wrap_fib.pyx"])])
def pysuite():
return unittest.TestLoader().discover('tests/python_tests')
if __name__ == '__main__':
setup(
name='so',
version='0.1',
ext_modules=exts,
test_suite='setup.pysuite'
)
, расширяя команду test
Последнее требование - запуск тестов C.Мы можем встроить их, переопределив команду test
и вызвав оттуда некоторый пользовательский код.Преимущество этого в том, что distutils
предлагает командный API со многими полезными функциями, такими как копирование файлов или выполнение внешних команд:
# setup.py
import os
import unittest
from Cython.Build import cythonize
from setuptools import setup, Extension
from setuptools.command.test import test as test_orig
exts = cythonize([Extension("wrap_fib", sources=["cfib.c", "wrap_fib.pyx"])])
class test(test_orig):
def run(self):
# run python tests
super().run()
# run c tests
self.announce('Running C tests ...')
pwd = os.getcwd()
os.chdir('tests/C_tests')
self.spawn(['bash', 'run_all.sh'])
os.chdir(pwd)
def pysuite():
return unittest.TestLoader().discover('tests/python_tests')
if __name__ == '__main__':
setup(
name='so',
version='0.1',
ext_modules=exts,
test_suite='setup.pysuite',
cmdclass={'test': test}
)
Я расширил оригинальную команду test
, выполнив некоторые дополнительные действия послеМодульные тесты Python завершены (обратите внимание на вызов внешней команды через self.spawn
).Все, что осталось, - это заменить стандартную команду test
на обычную, введя cmdclass
в функции настройки.
Теперь у вас есть все, что собрано в сценарии установки, и python setup.py test
сделает всю грязнуюjob.
Но, не будучи sudo на сервере gitlab, я получаю следующую ошибку
У меня нет опыта работы с Gitlab CI, но я могу 'Представьте, что нет возможности установить пакеты на сервере сборки.Может быть, этот вопрос будет полезен: Как использовать sudo в скрипте сборки для gitlab ci?
Если другого варианта нет, вы можете загрузить локальную копию setuptools
с ez_setup.py
.Однако обратите внимание, что хотя этот метод все еще работает, недавно он был объявлен устаревшим .
Кроме того, если вам случится использовать последнюю версию Python (3.4 и новее), то вам следует иметьpip
в комплекте с дистрибутивом Python, поэтому должна быть возможность установить setuptools
без прав root с
$ python -m pip install --user setuptools