Как выполнить модульное тестирование кода Excel VBA - PullRequest
33 голосов
/ 28 декабря 2010

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

Ответы [ 3 ]

34 голосов
/ 01 марта 2015

Отказ от ответственности : У меня есть GitHub-репозиторий Rubberduck, и я один из разработчиков, вовлеченных в проект.

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's wrong?"
End Sub

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


Вики-страница для модульного тестирования в репозитории Rubberduck GitHub объясняет почти все, что можно объяснить по поводу его использования.


Последние предварительные версии 2.1 включают начало "фальшивых" фреймворков, которые могут быть использованы для перехвата ряда вызовов стандартных библиотек, которые обычно мешают юнит-тестам, буквально превращая стандартную библиотеку в "тестовые фальшивки" который можно настроить так, чтобы он вел себя так, как указано при выполнении в контексте модульного теста Rubberduck, например, 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

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

6 голосов
/ 25 сентября 2013

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

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

3 голосов
/ 19 июля 2016

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

...