Spec-Zone.ru › NumPy 2.0

Набор тестов 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        extra_dat=kwargs.get("extra_dat", {}),
 2    )
 3
 4    # Compile the module
 5    # NOTE: Catch-all since without distutils it is hard to determine which
 6    # compiler stack is on the CI
 7    try:
 8        backend.compile()
 9    except:
10        pytest.skip("Failed to compile module")

Этот класс содержит множество вспомогательных функций для разбора и компиляции файлов исходного кода тестов. Его дочерние классы могут переопределять свой член данных sources для предоставления собственных файлов исходного кода. Этот суперкласс затем скомпилирует добавленные файлы исходного кода при создании объекта, а их функции будут добавлены в член данных self.module. Таким образом, дочерние классы смогут получить доступ к функциям Fortran, указанным в файле исходного кода, вызвав self.module.[fortran_function_name].

Пример

Рассмотрим следующие подпрограммы, содержащиеся в файле с именем 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 вызывает подпрограммы и проверяет результаты.

© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/f2py/f2py-testing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API