Najlepszy sposób na przetestowanie aplikacji MS Access?

Z kodem, formularzami i danymi wewnątrz tej samej bazy danych zastanawiam się, jakie są najlepsze praktyki, aby zaprojektować zestaw testów dla aplikacji Microsoft Access (powiedzmy dla Access 2007).

Jednym z głównych problemów z formularzami testowymi jest to, że tylko kilka kontrolek ma uchwyt hwnd, a inne kontrolki mają tylko jeden, który mają focus, co sprawia, że automatyzacja jest dość nieprzejrzysta, ponieważ nie można uzyskać listy kontrolek na formularzu do działania.

Jakieś doświadczenie?
Author: Rino Raj, 2008-09-06

12 answers

1. Napisz Testowalny Kod

Po pierwsze, przestań wpisywać logikę biznesową do kodu formularza. To nie miejsce na to. Nie można go tam właściwie przetestować. W rzeczywistości nie powinieneś w ogóle testować swojej formy. Powinien to być martwy głupi prosty widok, który reaguje na interakcję z użytkownikiem, a następnie przekazuje odpowiedzialność za reagowanie na te działania innej klasie, która na testowalny.

Jak ty to robisz? Zapoznanie się z wzór Model-widok-kontroler to dobry początek.

Schemat kontrolera widoku modelu

Nie da się tego zrobić perfekcyjnie w VBA ze względu na fakt, że dostajemy albo zdarzenia albo interfejsy, nigdy oba, ale można się bardzo zbliżyć. Rozważ ten prosty formularz, który ma pole tekstowe i przycisk.

prosty formularz z polem tekstowym i przyciskiem

W kodzie formularza za, zawijamy wartość pola tekstowego we właściwość publiczną i ponownie podnosimy wszelkie zdarzenia, które nas interesują.

Public Event OnSayHello()
Public Event AfterTextUpdate()

Public Property Let Text(value As String)
    Me.TextBox1.value = value
End Property

Public Property Get Text() As String
    Text = Me.TextBox1.value
End Property

Private Sub SayHello_Click()
    RaiseEvent OnSayHello
End Sub

Private Sub TextBox1_AfterUpdate()
    RaiseEvent AfterTextUpdate
End Sub

Teraz potrzebujemy modelu do pracy. Tutaj stworzyłem nowy moduł klasy o nazwie MyModel. Tu jest kod, który poddamy próbie. Zauważ, że naturalnie ma podobną strukturę jak nasz pogląd.

Private mText As String
Public Property Let Text(value As String)
    mText = value
End Property

Public Property Get Text() As String
    Text = mText
End Property

Public Function Reversed() As String
    Dim result As String
    Dim length As Long

    length = Len(mText)

    Dim i As Long
    For i = 0 To length - 1
        result = result + Mid(mText, (length - i), 1)
    Next i

    Reversed = result
End Function

Public Sub SayHello()
    MsgBox Reversed()
End Sub

W końcu nasz kontroler łączy wszystko razem. Kontroler nasłuchuje zdarzeń formularza i komunikuje zmiany do modelu oraz uruchamia procedury modelu.

Private WithEvents view As Form_Form1
Private model As MyModel

Public Sub Run()
    Set model = New MyModel
    Set view = New Form_Form1
    view.Visible = True
End Sub

Private Sub view_AfterTextUpdate()
    model.Text = view.Text
End Sub

Private Sub view_OnSayHello()
    model.SayHello
    view.Text = model.Reversed()
End Sub

Teraz ten kod można uruchomić z dowolnego innego modułu. Na potrzeby tego przykładu użyłem standardowego modułu. Gorąco zachęcam możesz zbudować to samodzielnie za pomocą kodu, który podałem i zobaczyć, jak działa.

Private controller As FormController

Public Sub Run()
    Set controller = New FormController
    controller.Run
End Sub

Więc, to jest świetne i w ogóle ale co to ma wspólnego z testowaniem?! przyjacielu, ma Wszystko do testowania. Uczyniliśmy nasz kod testowalnym. W przykładzie, który podałem, nie ma powodu, aby nawet próbować przetestować GUI. Jedyne, co naprawdę musimy przetestować, to model. Tu cała prawdziwa logika jest.

Przejdźmy do kroku drugiego.

2. Wybierz Framework testowania jednostkowego

Nie ma tu zbyt wielu opcji. Większość frameworków wymaga instalacji dodatków COM, dużej ilości płyt, dziwnej składni, pisania testów jako komentarzy itp. Dlatego zaangażowałem się w budowanie jednego samodzielnie , więc ta część mojej odpowiedzi nie jest bezstronna, ale postaram się uczciwie podsumować to, co jest dostępne.

  1. AccUnit

    • działa tylko w Dostęp.
    • wymaga pisania testów jako dziwnej hybrydy komentarzy i kodu. (brak intellisense dla części komentarza.
    • tam na interfejs graficzny, który pomoże Ci napisać te dziwnie wyglądające testy.
    • projekt nie doczekał się żadnych aktualizacji od 2013 roku.
  2. VB Lite Unit Nie mogę powiedzieć, że osobiście go używałem. Jest tam, ale nie widział aktualizacji od 2005.

  3. XlUnit xlUnit nie jest okropny, ale też nie jest dobry. Jest niezgrabny i jest dużo kodu płyty kotła. To najlepsze z najgorszych, ale nie działa w Access. Więc to koniec.

  4. Zbuduj swój własny framework

    Byłem tam i zrobiłem to . Jest to prawdopodobnie więcej niż większość ludzi chce się dostać, ale jest całkowicie możliwe, aby zbudować Framework testowania jednostek w natywnym VBA kod.

  5. Rubberduck VBE Add-In ' S Unit Testing Framework
    Zastrzeżenie: jestem jednym z współtwórców .

    Jestem stronniczy, ale to zdecydowanie moja ulubiona grupa.

    • mały lub żaden kod płyty kotła.
    • Intellisense jest dostępny.
    • projekt jest aktywny.
    • więcej dokumentacji niż większość tych projektów.
    • Działa w większości głównych aplikacji biurowych, nie tylko Access.
  6. It jest, niestety, dodatkiem COM, więc musi być zainstalowany na komputerze.

3. Zacznij pisać testy

Wróćmy więc do naszego kodu z Sekcji 1. Jedynym kodem, który musieliśmy przetestować, była funkcja MyModel.Reversed(). Przyjrzyjmy się więc, jak może wyglądać ten test. (Podany przykład wykorzystuje Rubberduck, ale jest to prosty test i może przełożyć się na wybrany przez Ciebie framework.)
'@TestModule
Private Assert As New Rubberduck.AssertClass

'@TestMethod
Public Sub ReversedReversesCorrectly()

Arrange:
    Dim model As New MyModel
    Const original As String = "Hello"
    Const expected As String = "olleH"
    Dim actual As String

    model.Text = original

Act:
    actual = model.Reversed

Assert:
    Assert.AreEqual expected, actual

End Sub

Wytyczne do pisania dobrego Testy

    Przetestuj tylko jedną rzecz na raz.
  1. dobre testy zawodzą tylko wtedy, gdy do systemu został wprowadzony błąd lub wymagania uległy zmianie.
  2. nie włączaj zewnętrznych zależności, takich jak bazy danych i systemy plików. Te zewnętrzne zależności mogą sprawić, że testy zawiodą z przyczyn niezależnych od Ciebie. Po drugie, spowalniają twoje testy. Jeśli twoje testy są powolne, nie będziesz ich uruchamiał.
  3. użyj nazw testów, które opisują, co test jest testem. Nie. martw się, jeśli będzie długo. Najważniejsze, żeby była opisowa.

Wiem, że odpowiedź była trochę długa i późna, ale mam nadzieję, że pomoże to niektórym osobom zacząć pisać testy jednostkowe dla ich kodu VBA.

 23
Author: RubberDuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:40:33

Doceniam odpowiedzi Knoxa i Davida. Moja odpowiedź będzie gdzieś między nimi: wystarczy zrobić formularze, które nie wymagają debugowania!

Myślę, że formularze powinny być używane wyłącznie jako to, czym są w zasadzie, czyli interfejs graficzny tylko, oznacza to, że nie muszą być debugowane! Zadanie debugowania jest następnie ograniczone do modułów i obiektów VBA, co jest o wiele łatwiejsze w obsłudze.

Istnieje oczywiście naturalna tendencja do dodawania kodu VBA do formularzy i / lub kontrolek, szczególnie gdy Access oferuje Ci te świetne zdarzenia "po aktualizacji" i "przy zmianie" , ale zdecydowanie radzę ci nie umieszczać żadnego formularza lub kodu kontrolnego w module formularza. To sprawia, że dalsza Konserwacja i aktualizacja są bardzo kosztowne, gdzie kod jest podzielony między Moduły VBA i formularze / moduły sterowania.

To nie znaczy, że nie możesz już używać tego AfterUpdate eventu! Wystarczy umieścić standardowy kod w zdarzeniu, jak to:

Private Sub myControl_AfterUpdate()  
    CTLAfterUpdate myControl
    On Error Resume Next
    Eval ("CTLAfterUpdate_MyForm()")
    On Error GoTo 0  
End sub

Gdzie:

  • CTLAfterUpdate jest to standardowa procedura uruchamiana za każdym razem, gdy kontrolka jest aktualizowana w formie

  • CTLAfterUpdateMyForm jest to specyficzna procedura uruchamiana za każdym razem, gdy kontrola jest aktualizowana na MyForm

Mam wtedy 2 moduły. Pierwszy to

  • utilityFormEvents
    gdzie będę miał moje ctlafterupdate generic event

Drugi to

  • MyAppFormEvents
    zawierający specyficzny kod wszystkich specyficznych formularze aplikacji MyApp w tym procedura CTLAfterUpdateMyForm. Oczywiście, CTLAfterUpdateMyForm może nie istnieć, jeśli nie ma określonego kodu do uruchomienia. To dlatego odwracamy "W przypadku błędu" do "Wznów następny"...

Wybór takiego ogólnego rozwiązania wiele znaczy. Oznacza to, że osiągasz wysoki poziom normalizacji kodu (czyli bezbolesnej konserwacji kodu). A kiedy mówisz, że nie masz żadnego kodu specyficznego dla formularza, oznacza to również, że moduły formularza są w pełni standaryzowane, a ich produkcja może być automatyczne: po prostu powiedz, którymi zdarzeniami chcesz zarządzać na poziomie formularza/kontroli i zdefiniuj swoją ogólną / określoną terminologię procedur.
Napisz swój kod automatyzacji, raz na zawsze.
Zajmuje to kilka dni pracy, ale daje ekscytujące rezultaty. Korzystam z tego rozwiązania od 2 lat i jest ono oczywiście właściwe: moje formularze są w pełni i automatycznie tworzone od podstaw za pomocą "tabeli formularzy", połączonej z "Tabela Kontrolna".
Następnie mogę poświęcić swój czas na pracę nad konkretnymi procedurami formularza, jeśli w ogóle istnieją.

Normalizacja kodu, nawet z MS Access, jest długim procesem. Ale to naprawdę jest warte bólu!

 17
Author: Philippe Grondier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-07 12:50:14

Kolejną zaletą dostępu będącego aplikacją COM jest to, że można utworzyć aplikację . NET do uruchamiania i testowania aplikacji Access za pomocą automatyzacji. Zaletą tego jest to, że możesz użyć bardziej wydajnego frameworka testowego, takiego jak NUnit do pisania automatycznych testów assert przeciwko aplikacji Access.

Dlatego jeśli jesteś biegły w C # lub VB.NET w połączeniu z czymś takim jak NUnit można łatwiej stworzyć większy zasięg testu dla Twoja aplikacja dostępu.

 6
Author: Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:32

Chociaż to bardzo stara odpowiedź:

Istnieje AccUnit , specjalistyczny Framework testowy dla Microsoft Access.

 5
Author: paulroho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-12 15:20:12

Wziąłem stronę zkoncepcji Pythona doctest i zaimplementowałem procedurę Doctestów w Access VBA. To oczywiście nie jest pełne rozwiązanie do testowania jednostek. Jest jeszcze stosunkowo młody, więc wątpię, że wypracowałem wszystkie błędy, ale myślę, że jest wystarczająco dojrzały, aby wypuścić go na wolność.

Po prostu skopiuj poniższy kod do standardowego modułu kodu i naciśnij F5 wewnątrz Sub, aby zobaczyć go w akcji:

'>>> 1 + 1
'2
'>>> 3 - 1
'0
Sub DocTests()
Dim Comp As Object, i As Long, CM As Object
Dim Expr As String, ExpectedResult As Variant, TestsPassed As Long, TestsFailed As Long
Dim Evaluation As Variant
    For Each Comp In Application.VBE.ActiveVBProject.VBComponents
        Set CM = Comp.CodeModule
        For i = 1 To CM.CountOfLines
            If Left(Trim(CM.Lines(i, 1)), 4) = "'>>>" Then
                Expr = Trim(Mid(CM.Lines(i, 1), 5))
                On Error Resume Next
                Evaluation = Eval(Expr)
                If Err.Number = 2425 And Comp.Type <> 1 Then
                    'The expression you entered has a function name that ''  can't find.
                    'This is not surprising because we are not in a standard code module (Comp.Type <> 1).
                    'So we will just ignore it.
                    GoTo NextLine
                ElseIf Err.Number <> 0 Then
                    Debug.Print Err.Number, Err.Description, Expr
                    GoTo NextLine
                End If
                On Error GoTo 0
                ExpectedResult = Trim(Mid(CM.Lines(i + 1, 1), InStr(CM.Lines(i + 1, 1), "'") + 1))
                Select Case ExpectedResult
                Case "True": ExpectedResult = True
                Case "False": ExpectedResult = False
                Case "Null": ExpectedResult = Null
                End Select
                Select Case TypeName(Evaluation)
                Case "Long", "Integer", "Short", "Byte", "Single", "Double", "Decimal", "Currency"
                    ExpectedResult = Eval(ExpectedResult)
                Case "Date"
                    If IsDate(ExpectedResult) Then ExpectedResult = CDate(ExpectedResult)
                End Select
                If (Evaluation = ExpectedResult) Then
                    TestsPassed = TestsPassed + 1
                ElseIf (IsNull(Evaluation) And IsNull(ExpectedResult)) Then
                    TestsPassed = TestsPassed + 1
                Else
                    Debug.Print Comp.Name; ": "; Expr; " evaluates to: "; Evaluation; " Expected: "; ExpectedResult
                    TestsFailed = TestsFailed + 1
                End If
            End If
NextLine:
        Next i
    Next Comp
    Debug.Print "Tests passed: "; TestsPassed; " of "; TestsPassed + TestsFailed
End Sub

Kopiowanie, wklejanie i uruchamianie powyższego kodu z wydajność modułu o nazwie Module1:

Module: 3 - 1 evaluates to:  2  Expected:  0 
Tests passed:  1  of  2

Kilka szybkich notek:

    Nie ma żadnych zależności (gdy jest używany z poziomu dostępu)
  • używa Eval, która jest funkcją w dostępie.Application object model; oznacza to, że możesz używać go poza Access, ale wymagałoby to utworzenia dostępu.Obiekt aplikacji i w pełni kwalifikujący wywołania Eval
  • są pewne idiosynkrazje związane z Eval być świadomym
  • może może być używany tylko w funkcjach, które zwracają wynik, który pasuje do pojedynczej linii

Pomimo swoich ograniczeń, nadal uważam, że zapewnia sporo huku za Twoją kasę.

Edit : oto prosta funkcja z "doctest rules" funkcja musi spełniać.

Public Function AddTwoValues(ByVal p1 As Variant, _
        ByVal p2 As Variant) As Variant
'>>> AddTwoValues(1,1)
'2
'>>> AddTwoValues(1,1) = 1
'False
'>>> AddTwoValues(1,Null)
'Null
'>>> IsError(AddTwoValues(1,"foo"))
'True

On Error GoTo ErrorHandler

    AddTwoValues = p1 + p2

ExitHere:
    On Error GoTo 0
    Exit Function

ErrorHandler:
    AddTwoValues = CVErr(Err.Number)
    GoTo ExitHere
End Function
 5
Author: mwolfe02,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:08

Chciałbym zaprojektować aplikację tak, aby miała jak najwięcej pracy w zapytaniach i podprogramach vba, tak aby twoje testy mogły składać się z wypełniania testowych baz danych, uruchamiania zestawów zapytań produkcyjnych i vba przeciwko tym bazom danych, a następnie patrząc na wyjście i porównując, aby upewnić się, że wyjście jest dobre. To podejście oczywiście nie testuje GUI, więc można rozszerzyć testowanie o serię skryptów testowych (tutaj mam na myśli jak dokument word, który mówi otwarty formularz 1, i kliknij control 1), które są wykonywane ręcznie.

To zależy od zakresu projektu jako poziomu automatyzacji niezbędnego dla aspektu testowego.

 4
Author: Knox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-06 12:13:42

Jeśli jesteś zainteresowany testowaniem aplikacji Access na bardziej szczegółowym poziomie, a konkretnie samego kodu VBA, VB Lite Unit jest świetnym frameworkiem do testowania jednostek w tym celu.

 2
Author: Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:54:29

Są tu dobre sugestie, ale dziwię się, że nikt nie wspomniał o scentralizowanym przetwarzaniu błędów. Można uzyskać dodatki, które pozwalają na szybkie function / sub template i do dodawania numerów linii (używam MZ-tools). Następnie wyślij wszystkie błędy do jednej funkcji, gdzie możesz je zarejestrować. Możesz również złamać wszystkie błędy, ustawiając pojedynczy punkt przerwania.

 2
Author: Steve Mallory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 20:28:43

Uważam, że możliwości testowania jednostkowego w moich aplikacjach jest stosunkowo niewiele. Większość kodu, który piszę, współdziała z danymi tabeli lub systemem plików, więc zasadniczo trudno jest przetestować jednostki. Na początku próbowałem podejścia, które może być podobne do wyśmiewania (spoofing), gdzie stworzyłem kod, który miał opcjonalny parametr. Jeżeli parametr został użyty, wtedy procedura użyje parametru zamiast pobierać dane z bazy danych. Bardzo łatwo jest skonfigurować zdefiniowaną przez użytkownika typ, który ma te same typy pól co wiersz danych i przekazuje je do funkcji. Mam teraz sposób na wprowadzenie danych testowych do procedury, którą chcę przetestować. Wewnątrz każdej procedury znajdował się jakiś kod, który zamieniał prawdziwe źródło danych na źródło danych testowych. To pozwoliło mi używać testów jednostkowych na szerszej gamie funkcji, używając własnych funkcji testowania jednostkowego. Pisanie testu jednostkowego jest łatwe, jest po prostu powtarzalne i nudne. W końcu zrezygnowałem z testów jednostkowych i zacząłem używać inne podejście.

Piszę aplikacje wewnętrzne głównie dla siebie, więc mogę sobie pozwolić czekać, aż problemy mnie znajdą, zamiast mieć doskonały kod. Jeśli piszę aplikacje dla klientów, zazwyczaj klient nie jest w pełni świadomy, ile kosztuje tworzenie oprogramowania, więc potrzebuję taniego sposobu na uzyskanie wyników. Pisanie testów jednostkowych polega na pisaniu testu, który wypycha złe dane w procedurze, aby sprawdzić, czy procedura poradzi sobie z tym odpowiednio. Testy jednostkowe potwierdzają również, że dobre dane są odpowiednio obsługiwane. Moje obecne podejście opiera się na zapisywaniu walidacji danych wejściowych do każdej procedury w aplikacji i podnoszeniu flagi sukcesu po pomyślnym zakończeniu kodu. Każda procedura wywołująca sprawdza flagę success przed użyciem wyniku. Jeśli wystąpi problem, jest on zgłaszany za pomocą komunikatu o błędzie. Każda funkcja ma flagę sukcesu, wartość zwrotną, komunikat o błędzie, komentarz i pochodzenie. Typ zdefiniowany przez użytkownika (FR dla zwracania funkcji) zawiera członków danych. Każda dana funkcja wiele wypełnia tylko niektóre z członków danych w typie zdefiniowanym przez użytkownika. Gdy funkcja jest uruchomiona, zwykle zwraca success = true i wartość zwracaną, a czasami komentarz. Jeśli funkcja nie powiedzie się, zwraca success = false i Komunikat o błędzie. Jeśli łańcuch funkcji zawiedzie, komunikaty o błędach są zmieniane, ale wynik jest o wiele bardziej czytelny niż zwykły ślad stosu. Źródła są również przykute, więc wiem, gdzie wystąpił problem. Na aplikacja rzadko ulega awarii i dokładnie zgłasza wszelkie problemy. Wynik jest o wiele lepszy niż standardowa obsługa błędów.

Public Function GetOutputFolder(OutputFolder As eOutputFolder) As  FunctRet

        '///Returns a full path when provided with a target folder alias. e.g. 'temp' folder

            Dim fr As FunctRet

            Select Case OutputFolder
            Case 1
                fr.Rtn = "C:\Temp\"
                fr.Success = True
            Case 2
                fr.Rtn = TrailingSlash(Application.CurrentProject.path)
                fr.Success = True
            Case 3
                fr.EM = "Can't set custom paths – not yet implemented"
            Case Else
                fr.EM = "Unrecognised output destination requested"
            End Select

    exitproc:
        GetOutputFolder = fr

    End Function

Kod wyjaśniony. eOutputFolder jest zdefiniowanym przez użytkownika Enum jak poniżej

Public Enum eOutputFolder
    eDefaultDirectory = 1
    eAppPath = 2
    eCustomPath = 3
End Enum

Używam Enum do przekazywania parametrów do funkcji, ponieważ tworzy to ograniczony zestaw znanych wyborów, które może zaakceptować funkcja. Enums dostarcza również intellisense przy wprowadzaniu parametrów do funkcji. Przypuszczam, że zapewniają one podstawowy interfejs dla funkcja.

'Type FunctRet is used as a generic means of reporting function returns
Public Type  FunctRet
    Success As Long     'Boolean flag for success, boolean not used to avoid nulls
    Rtn As Variant      'Return Value
    EM As String        'Error message
    Cmt As String       'Comments
    Origin As String    'Originating procedure/function
End Type

Typ zdefiniowany przez użytkownika, taki jak FunctRet, również zapewnia uzupełnianie kodu, co pomaga. W ramach procedury zwykle przechowuję wewnętrzne wyniki do anonimowej zmiennej wewnętrznej (fr) przed przypisaniem wyników do zmiennej zwrotnej (GetOutputFolder). To sprawia, że procedury zmiany nazwy są bardzo łatwe, ponieważ tylko góra i dół zostały zmienione.

Podsumowując, opracowałem framework z ms-access, który obejmuje wszystkie operacje związane z VBA. Test jest trwale zapisany w procedurach, a nie test jednostki czasu rozwoju. W praktyce kod nadal działa bardzo szybko. Jestem bardzo ostrożny, aby zoptymalizować funkcje niższego poziomu, które można wywołać dziesięć tysięcy razy na minutę. Co więcej, mogę używać kodu w produkcji, gdy jest on rozwijany. Jeśli wystąpi błąd, jest on przyjazny dla użytkownika, a źródło i przyczyna błędu są zwykle oczywiste. Błędy są zgłaszane z formularza wywołującego, a nie z jakiegoś modułu w warstwie biznesowej, który jest ważną zasadą projektowania aplikacji. Co więcej, nie mam ciężaru utrzymywania kodu testowania jednostkowego, co jest naprawdę ważne, gdy rozwijam projekt, a nie koduję wyraźnie konceptualizowany projekt.

Są pewne potencjalne problemy. Testowanie nie jest zautomatyzowane, a nowy zły kod jest wykrywany tylko podczas uruchamiania aplikacji. Kod nie wygląda jak standardowy kod VBA (zwykle jest krótszy). Podejście to ma jednak pewne zalety. Jest o wiele lepiej że za pomocą obsługi błędów tylko do logowania błędu, ponieważ użytkownicy zwykle kontaktują się ze mną i dać mi znaczący komunikat o błędzie. Może również obsługiwać procedury, które działają z danymi zewnętrznymi. JavaScript przypomina mi VBA, ciekawe dlaczego JavaScript to kraina frameworków, a VBA w ms-access nie.

Kilka dni po napisaniu tego postu, znalazłem artykuł na CodeProject , który jest zbliżony do tego, co napisałem powyżej. Artykuł porównuje i kontrastuje obsługę wyjątków i obsługi błędów. To, co zasugerowałem powyżej, jest podobne do obsługi wyjątków.

 2
Author: AndrewM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-28 00:39:20

Nie próbowałem tego, ale możesz spróbować opublikować swoje formularze dostępu jako strony internetowe dostępu do danych do czegoś takiego jak sharepoint lub tak jak strony internetowe , a następnie użyć narzędzia, takiego jak selenium , aby uruchomić przeglądarkę z zestawem testów.

Oczywiście nie jest to tak idealne, jak kierowanie kodem bezpośrednio przez testy jednostkowe, ale może Ci to pomóc. powodzenia

 1
Author: Xian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-06 12:21:02

Access jest aplikacją COM. Użyj COM, NIE Windows API. aby przetestować rzeczy w Access.

Najlepszym środowiskiem testowym dla aplikacji Access jest Access. Wszystkie Twoje formularze/raporty/tabele/Kod / zapytania są dostępne, istnieje język skryptowy podobny do MS Test( Ok, prawdopodobnie nie pamiętasz MS Test), Istnieje środowisko bazy danych do przechowywania skryptów testowych i wyników testów, a umiejętności, które tutaj zbudujesz, można przenieść do Twojej aplikacji.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 02:52:29

Strony dostępu do danych były przestarzałe przez MS od dłuższego czasu i nigdy tak naprawdę nie działały (były zależne od zainstalowanych widżetów Office i działały tylko w IE, i tylko wtedy źle).

Prawdą jest, że kontrolki dostępu, które mogą uzyskać fokus, mają uchwyt okna tylko wtedy, gdy mają fokus (a te, które nie mogą uzyskać Fokusa, takie jak etykiety, nigdy nie mają uchwytu okna). To sprawia, że dostęp jest wyjątkowo nieodpowiedni do testów opartych na klamkach okiennych / align = "left" /

Rzeczywiście, mam pytanie, dlaczego chcesz robić tego rodzaju testy w Access. Brzmi to dla mnie jak twój podstawowy dogmat programowania Extreme, a nie wszystkie zasady i praktyki XP można dostosować do pracy z aplikacjami dostępowymi-kwadratowy kołek, okrągły otwór.

Więc cofnij się i zadaj sobie pytanie, co próbujesz osiągnąć i weź pod uwagę, że może być konieczne użycie zupełnie innych metod niż te, które są oparte na podejściach, które po prostu nie mogą działać w Dostęp.

Lub czy tego rodzaju zautomatyzowane testy są w ogóle ważne lub nawet przydatne w aplikacji Access.

 -1
Author: David-W-Fenton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-15 16:00:20