Добавить в корзинуПозвонить
Найти в Дзене
IT4BIM

Unit тесты под Revit с помощью TUnit

Unit-тесты (модульные тесты) — это небольшие автономные проверки, которые проверяют корректность работы отдельного блока кода, например метода или класса. В контексте разработки под Revit это особенно важно, потому что плагины и библиотеки часто взаимодействуют с большими объектными моделями, параметрами семейств и API, где даже небольшая ошибка может привести к критическим последствиям в проекте. Зачем нужны Unit-тесты под Revit: 1. Раннее выявление ошибок — тесты позволяют проверить отдельные методы и компоненты до запуска их на реальных проектах. 2. Повышение надежности — благодаря тестам вы уверены, что изменения в коде не сломают уже работающий функционал. 3. Документация кода — тесты показывают, как именно должен работать метод, и служат живым примером использования. 4. Ускорение разработки — тестирование маленьких частей кода (без запуска полноценного Revit) часто быстрее, чем проверка всей модели вручную. Чтобы писать Unit-тесты для Revit, сначала нужно правильно настроить прое
Оглавление

Введение в Unit-тестирование для Revit

Unit-тесты (модульные тесты) — это небольшие автономные проверки, которые проверяют корректность работы отдельного блока кода, например метода или класса. В контексте разработки под Revit это особенно важно, потому что плагины и библиотеки часто взаимодействуют с большими объектными моделями, параметрами семейств и API, где даже небольшая ошибка может привести к критическим последствиям в проекте.

Зачем нужны Unit-тесты под Revit:

1. Раннее выявление ошибок — тесты позволяют проверить отдельные методы и компоненты до запуска их на реальных проектах.

2. Повышение надежности — благодаря тестам вы уверены, что изменения в коде не сломают уже работающий функционал.

3. Документация кода — тесты показывают, как именно должен работать метод, и служат живым примером использования.

4. Ускорение разработки — тестирование маленьких частей кода (без запуска полноценного Revit) часто быстрее, чем проверка всей модели вручную.

Настройка проекта для Unit-тестов под Revit

Чтобы писать Unit-тесты для Revit, сначала нужно правильно настроить проект. В качестве примера мы будем использовать проект Bim.RevitTestsExamples, которая уже содержит готовую конфигурацию для разных версий Revit.

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

Проект тестов создаётся на основе SDK проекта Revit и выглядит примерно так:

-2

Ключевые моменты:

1. Configurations — список версий и конфигураций Revit, для которых мы будем запускать тесты.

2. PackageReference — подключение основных библиотек: вашей библиотеки для Revit (Nice3point.Revit.Api.RevitAPI) c Revit API и фреймворка для Unit-тестов под Revit (Nice3point.TUnit.Revit).

Класс TestsConfiguration.cs

Важная часть тестового проекта — класс TestsConfiguration.cs. Он отвечает за конфигурацию запуска тестов в контексте Revit и выглядит так:

-3

Объяснение:

• Атрибут [assembly: TestExecutor<RevitThreadExecutor>] указывает, что все тесты должны выполняться в Revit-потоке. Это важно, потому что большинство операций с документами и элементами Revit требуют работы в основном потоке API.

• RevitThreadExecutor обеспечивает безопасное выполнение тестов внутри среды Revit, эмулируя поведение приложения.

Таким образом, с правильно настроенным проектом и классом конфигурации вы можете писать тесты для ваших плагинов и библиотек Revit, не запуская полный Revit вручную каждый раз. Это ускоряет разработку и делает её более предсказуемой.

Пример Unit-теста для Revit API

https://github.com/erikgett/Bim.Examples/tree/master/Bim.RevitTestsExamples - больше примеров смотреть тут

Рассмотрим простой пример теста для метода BoundingBoxXYZ.Contains, который проверяет, находится ли точка внутри трёхмерного BoundingBox. Этот тест написан с использованием фреймворка Nice3point.TUnit.Revit и наследуется от базового класса RevitApiTest, что позволяет безопасно работать с Revit API внутри тестов.

-4
-5

Логика тестов

Тесты строятся по стандартной схеме Arrange → Act → Assert:

1. Arrange (Подготовка)

1. Создаётся объект BoundingBoxXYZ с минимальной (Min) и максимальной (Max) точкой.

2. Определяется точка, которую мы хотим проверить (внутри или вне коробки).

2. Act (Действие)

1. Вызывается метод Contains для проверки, находится ли точка внутри коробки.

3. Assert (Проверка)

1. С помощью Assert.That(...).IsTrue() или IsFalse() проверяем, что метод Contains возвращает правильный результат.

Возможности тестов

вы можете так же открыть диспетчер тестов и через него запускать как все тесты сразу так и один нужный вам например в режиме отладки как показано ниже

-6
при наведении на тест есть возможность запуска теста или отладки теста
при наведении на тест есть возможность запуска теста или отладки теста
здесь мы видим что отладка реально работает и объекты Revit api создаются бе проблем
здесь мы видим что отладка реально работает и объекты Revit api создаются бе проблем

Что проверяет тест

• Contains_PointInsideBox_ReturnsTrue — тест проверяет, что точка внутри BoundingBox действительно определяется как находящаяся внутри.

• Contains_PointOutsideBox_ReturnsFalse — тест проверяет, что точка вне BoundingBox корректно определяется как не находящаяся внутри.

Зачем это нужно

Даже такой простой тест помогает:

• Быстро выявлять ошибки при изменении методов работы с BoundingBox. Ведь теперь появилась возможность отладить все покрытые тестами методы и возможность отладки тестов и простановки точек остановы в сами тестах.

• Гарантировать корректную работу базовых математических операций в ваших плагинах для Revit.

• Создавать надёжную базу для более сложных тестов, работающих с документами и элементами Revit.

За основу были взяты материалы данных репозиториев:

RevitExtensions/tests/Nice3point.Revit.Extensions.Tests at main · Nice3point/RevitExtensions
GitHub - Nice3point/RevitUnit: .NET testing framework for Revit

Хочу выразить большое спасибо Роману Карповичу за то, что поделился таким инструментом!