Подтвердить что ты не робот

Как unit test код Excel VBA

Есть ли у кого-нибудь опыт работы с модульным тестированием кода Excel VBA? Я хочу как можно безболезненно ввести модульные тесты в какой-то старый код Excel VBA. Одна из моих идей заключалась в том, чтобы использовать VSTO для вызова кода из книги Excel. Я хотел бы знать, пробовали ли другие это для модульного тестирования кода Excel, а также любые другие методы, которые они могли использовать для модульного тестирования Excel VBA.

Я был бы признателен за некоторые указания относительно любых доступных фреймворков и/или советов по модульному тестированию кода Excel VBA.

4b9b3361

Ответ 1

Отказ от ответственности. У меня есть репозиторий Rubberduck GitHub, и я один из разработчиков, участвующих в проекте.

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

'@TestModule
Private Assert As New Rubberduck.AssertClass

'@TestMethod
Public Sub TestMethod1()
    Assert.Inconclusive "Test method is not written yet."
End Sub

'@TestMethod
Public Sub AnotherTestMethod()
    Assert.IsTrue False, "Something wrong?"
End Sub

И затем вы сможете перемещаться и запускать свои тестовые методы в стыковочном окне, которое также дает вам меню для быстрого добавления меток метода arr-act-assert, а AssertClass также может быть слишком поздним, поэтому вы не не нужно беспокоиться о развертывании Rubberduck в любом месте, кроме вашей среды разработки, только чтобы компилировать код.


Страница unit testing wiki в репозитории Rubberduck GitHub объясняет почти все, что можно объяснить об использовании.


В последних версиях версии 2.1 есть начало "фальшивых" фреймов, которые могут использоваться для захвата ряда стандартных вызовов библиотеки, которые обычно мешают единичным тестам, буквально превращая стандартную библиотеку в "тестовые подделки", которые могут быть настроены так, как указано при выполнении в контексте Rubberduck unit test, например MsgBox:

'@TestMethod
Public Sub TestMethod1()
    On Error GoTo TestFail

    Fakes.MsgBox.Returns 42 ' MsgBox function will return 42

    'here you'd invoke the procedure you want to test
    Debug.Print MsgBox("This MsgBox isn't going to pop up!", vbOkOnly, "Rubberduck") 'prints 42

    With Fakes.MsgBox.Verify ' Test will pass if MsgBox was invoked as specified
        .Parameter "prompt", "This MsgBox isn't going to pop up!"
        .Parameter "buttons", vbOkOnly
        .Parameter "title", "Rubberduck"
    End With
TestExit: 
    Exit Sub
TestFail: 
    Assert.Fail "Test raised an error: #" & Err.Number & " - " & Err.Description
End Sub

Взносы на расширение API Fakes для покрытия большего числа функций более чем приветствуются. Особенно полезно было бы использовать ссылки FileSystemObject.

Ответ 2

Я просто искал одно и то же: http://accunit.access-codelib.net/, который очень хорошо интегрируется в среду VBA.

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

Ответ 3

xlwings ребята просто продемонстрировали, как модульные тесты функций VBA в Python. По существу, вам не нужно ничего добавлять в свою книгу, но вы пишете "автономный" код Python, который вызывает ваши функции VBA, чтобы вы могли сравнивать ожидаемые и фактические результаты ваших функций VBA.