2010-12-28 44 views
29

Czy ktoś ma jakieś doświadczenie z jednostką testującą kod Excel VBA? Chcę wprowadzić testy jednostkowe do starszego kodu Excel VBA bezboleśnie, jak to możliwe. Jedną z moich pomysłów byłoby użycie VSTO do wywołania kodu z poziomu skoroszytu programu Excel. Chciałbym wiedzieć, czy inni próbowali tego w celu przetestowania kodu programu Excel w Excelu, a także wszelkich innych metod, które mogli zastosować do testowania jednostkowego Excel VBA.Jak testować jednostkę Excel VBA kod

Byłbym wdzięczny za pewne wskazówki dotyczące wszelkich dostępnych frameworków i/lub wskazówek dotyczących testowania jednostkowego kodu Excel VBA.

+3

Może zainteresować: http://stackoverflow.com/questions/1792188/how-to-set-a-itit-test-in-vba-excel-macro – Fionnuala

+0

Dzięki, przyjrzę się. –

Odpowiedz

6

Po prostu szukałem tego samego i znalazłem: http://accunit.access-codelib.net/, które całkiem dobrze integruje się z VBA IDE.

Uwaga: Przeglądanie strony w języku niemieckim i korzystanie z narzędzi tłumaczenia przeglądarki wydaje się dostarczać więcej informacji niż strony angielskie.

+0

Próbowałem Rubberduck bez powodzenia. Z drugiej strony, AccUnit był naprawdę łatwy w wykonaniu. Podają nawet przykłady przy wstawianiu klasy testowej. –

+0

@DavidDuran, jeśli Rubberduck ma problem, nie mówienie nikomu, że go nie naprawi ... Informacje zwrotne są zawsze mile widziane, czy to na [GitHub] (https://github.com/rubberduck-vba/Rubberduck) lub nawet nasz pokój wojenny na [czacie SE] (https://chat.stackexchange.com/rooms/14929/vba-rubberducking). Twoje zdrowie! –

26

Zastrzeżone: Jestem właścicielem GitHub repozytorium Rubberduck, a ja jestem jednym z deweloperów biorących udział w projekcie.

Rubberduck jest w trakcie aktywnego rozwoju. To znacznie więcej niż narzędzie do testów jednostkowych dla VBA chociaż, ale działa całkiem dobrze i pozwala pisać testy jednostkowe VBA prawie bez boilerplate:

'@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 

a następnie dostać się do poruszania się i uruchomić swoje metody badań w zadokowanym oknie narzędziowym, które daje ci również menu do szybkiego dodawania kodów pośredniczących przy rozmieszczaniu-aktywowaniu, a AssertClass może być również późno związany, więc nie musisz się martwić o wdrażanie Rubberduck nigdzie indziej niż w twoim rozwoju środowisko tylko po to, aby kod był kompilowany.


unit testing wiki page na GitHub repozytorium Rubberduck wyjaśnia prawie wszystko, co jest do wyjaśnienia na temat korzystania z niej.


najnowszej 2.1 wersjach przedpremierowych obejmuje początki „podróbki” ram, które mogą być wykorzystane do przejęcia szereg standardowych wywołań bibliotecznych, które normalnie zakłóca testów jednostkowych, przez dosłownie toczenia standardowej biblioteki do „podróbki test”, który może być ustawiony tak, aby zachowywać się jak określono, gdy wykonywane w ramach testów jednostkowych Rubberduck np MsgBox połączeń:

'@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 

treści, aby rozwinąć tę Fakes API do pokrycia więcej funkcji są bardziej niż mile widziane. Szczególnie przydatne byłoby wywoływanie wywołań FileSystemObject.

3

Faceci xlwings właśnie przetestowali, jak wykonać . Zasadniczo nie trzeba dodawać niczego do skoroszytu, ale można napisać "samodzielny" kod w języku Python, który wywołuje funkcje VBA, aby można było porównać oczekiwane i rzeczywiste wyniki funkcji VBA.