Тестовый набор F2PY#
Набор тестов F2PY находится в директории numpy/f2py/tests. Его цель - обеспечить правильный перевод возможностей языка Fortran в Python. Например, пользователь может указать начальные и конечные индексы массивов в Fortran. Это поведение переводится в сгенерированную библиотеку CPython, где массивы строго начинаются с индекса 0.
Каталог тестового набора выглядит следующим образом:
./tests/
├── __init__.py
├── src
│ ├── abstract_interface
│ ├── array_from_pyobj
│ ├── // ... several test folders
│ └── string
├── test_abstract_interface.py
├── test_array_from_pyobj.py
├── // ... several test files
├── test_symbolic.py
└── util.py
Файлы, начинающиеся с test_ содержит тесты для различных аспектов f2py, от разбора
файлов Fortran до проверки документации модулей. src каталог содержит файлы исходного кода на Fortran, на которых мы проводим тестирование. util.py содержит служебные функции для сборки и импорта модулей Fortran во время тестирования с использованием временного расположения.
Добавление теста#
Текущий набор тестов F2PY предшествует pytest и поэтому не использует фикстуры. Вместо этого тестовые файлы содержат тестовые классы, которые наследуются от F2PyTest
класс присутствует в util.py.
1 backend = SimplifiedMesonBackend(
2 modulename=module_name,
3 sources=source_files,
4 extra_objects=kwargs.get("extra_objects", []),
5 build_dir=build_dir,
6 include_dirs=kwargs.get("include_dirs", []),
7 library_dirs=kwargs.get("library_dirs", []),
8 libraries=kwargs.get("libraries", []),
9 define_macros=kwargs.get("define_macros", []),
10 undef_macros=kwargs.get("undef_macros", []),
Этот класс имеет множество вспомогательных функций для разбора и компиляции исходных файлов тестов. Его дочерние классы могут переопределять его sources член данных для предоставления собственных исходных файлов. Этот суперкласс затем скомпилирует добавленные исходные файлы при создании объекта, и их функции будут добавлены к self.module член данных. Таким образом, дочерние классы смогут
получать доступ к функциям Fortran, указанным в исходном файле, вызывая
self.module.[fortran_function_name].
Новое в версии v2.0.0b1.
Каждый из f2py тесты должны выполняться без сбоев, если на хост-машине отсутствуют компиляторы Fortran. Для облегчения этого CompilerChecker используется, по сути предоставляя meson зависимый набор утилит, а именно
has_{c,f77,f90,fortran}_compiler().
Для CLI тестов в test_f2py2e, флаги, которые, как ожидается, вызывают meson
или иным образом зависят от компилятора, нужно вызывать compiler_check_f2pycli()
вместо f2pycli().
Пример#
Рассмотрим следующие подпрограммы, содержащиеся в файле с именем add-test.f
subroutine addb(k)
real(8), intent(inout) :: k(:)
k=k+1
endsubroutine
subroutine addc(w,k)
real(8), intent(in) :: w(:)
real(8), intent(out) :: k(size(w))
k=w+1
endsubroutine
Первая процедура addb просто принимает массив и увеличивает его элементы на 1. Вторая подпрограмма addc присваивает новый массив k с элементами, большими, чем элементы входного массива w на 1.
Тест может быть реализован следующим образом:
class TestAdd(util.F2PyTest):
sources = [util.getpath("add-test.f")]
def test_module(self):
k = np.array([1, 2, 3], dtype=np.float64)
w = np.array([1, 2, 3], dtype=np.float64)
self.module.addb(k)
assert np.allclose(k, w + 1)
self.module.addc([w, k])
assert np.allclose(k, w + 1)
Мы переопределяем sources член данных для предоставления исходного файла. Исходные файлы компилируются, и подпрограммы присоединяются к члену данных модуля при создании объекта класса. test_module функция вызывает подпрограммы и проверяет их результаты.