2010-07-28 14 views
8

Implementuję generowanie dokumentów MS Word przy użyciu kontroli treści i pakietu SDK OpenXML. Chciałbym mieć zautomatyzowane testowanie tego kodu (testy jednostkowe lub kilka łatwych testów automatyzacji interfejsu użytkownika).Zautomatyzowane testowanie OpenXML SDK

Czy ktoś ma doświadczenie w testowaniu generowania dokumentów MS Word? Jakie są możliwe opcje?

Z góry dziękuję!

+0

Dlaczego testy jednostkowe OpenXML muszą różnić się od standardowych. Czy próbujesz sprawdzić, czy dokument może zostać otwarty słowem lub czy będzie wyglądać dobrze? –

+0

Nie jest to rozbieżne, tylko technicznie trudne. Typowym testem jest Arrange-Act-Assert. Tak więc pytanie brzmi: jak możemy z łatwością zrobić ostatnią część - Asersem. Być może za pomocą jakiegoś mechanizmu automatyzacji słów lub infrastruktury automatyzacji interfejsu użytkownika, ale nie widzę łatwego sposobu na to. Tak więc kończę testami generującymi raport i otwierającymi się w słowie, więc ręcznie sprawdzam, czy raport jest w porządku. To nie jest "czysty" test jednostkowy, ale lepszy niż uruchomienie pełnej aplikacji do generowania potrzebnych raportów. Interesuje mnie również testowanie kodu, który działa bezpośrednio z Open XML, wszystkie inne części, które rozdzieliłem i przetestowałem zwykłymi testami jednostkowymi. – Andrii

Odpowiedz

5

Nie, nie przeprowadzałem testów jednostkowych generowania dokumentów MS Word, ale, jak mówi Ingó Vals, nie powinno to się różnić od jakichkolwiek innych testów jednostkowych.

1) [Opcjonalnie - aby upewnić się, że rozumiesz prawidłowe używanie SDK do swoich potrzeb]. Sprawdź, jak aplikacja powinna obsługiwać pakiet SDK. Napisz kilka skryptów testowych, które naśladują zamierzoną funkcjonalność i upewnij się, że generowane przez nie dokumenty Word spełniają Twoje oczekiwania.

2) Utwórz interfejs (lub interfejsy) zawierający metody odpowiadające funkcjom potrzebnym do generowania dokumentacji. Uwaga: interfejs nie musi oferować pełnej funkcjonalności pakietu SDK OpenXML - tylko funkcje potrzebne dla aplikacji.

3) Tworzenie konkretną implementację interfejsu, który przekazuje połączenia do SDK OpenXML

4) korzystać z utworzonego w aplikacji do wykonywania generacji Document Interface.

5) Użyj NUnit i NMock (lub podobnych) do napisania testów jednostkowych, które napędzają warstwę generacyjną aplikacji. Testy te powinny wykorzystywać fałszywy interfejs, a nie instancję konkretnej implementacji. Możesz teraz potwierdzić w swoich testach, że twoja warstwa generacyjna zachowuje się zgodnie z oczekiwaniami.

+0

Dziękuję za odpowiedź, ale chodzi o to, że jestem zainteresowany testowaniem kodu, który bezpośrednio manipuluje pakietem Open XML SDK. Cała reszta, którą mogę oddzielić lub kpić, to jasne. Używanie mocks insdead do rzeczywistego wywoływania Open XML SDK nie jest mi do gustu, ponieważ chcę przetestować, że mój kod działa dobrze z SDK. Ktoś może twierdzić, że nie jest to czysty test jednostkowy, ale tego, czego naprawdę brakuje w moim bieżącym teście. – Andrii

+1

To, co opisałem, to jednostka testująca twój kod. Nazwałbym to, co chcesz, testem integracyjnym. W takim przypadku, wydaje mi się, że możesz pobrać SDK do wyprowadzenia Word XML i napisać metodę, która porówna wynikowy DOM z DOM, którego oczekujesz. –

+0

Tak, jednostki lub integracji lub automatyzacji interfejsu użytkownika lub co będzie działać. Sumowanie dowolnego typu testów automatycznych, które umożliwią weryfikację (część testowa). Sprawdza porównanie DOM. Wielkie dzięki! – Andrii

2

jestem rzeczywiście robi coś podobnego z OpenXML SDK dla arkuszy kalkulacyjnych i faktycznie wystarczy napisać OpenXML kodu API, które otwiera plik z strea m dla celów testowych. Testy jednostkowe nie mówią wystarczająco dużo, ponieważ musisz wiedzieć, czy jest to prawidłowy plik.

// There should be a sheet for every team 
[TestMethod] 
[HostType("Moles")] 
public void CaseExportTeamSheetsTest() 
{ 
    IRepository<ServiceTbl, ServiceTbl> ServiceRepository; 
    CaseController target; 
    BuildCaseControllerMoledCases(out ServiceRepository, out target); 
    FileStreamResult actual = target.Export(); using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(actual.FileStream, false)) 
    { 
     var services = ServiceRepository.All; 

     foreach (var item in services) 
     { 
      // get a worksheet foreach service 
      var sheets = spreadsheetDocument.WorkbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == item.ServiceName); 
      Assert.IsTrue(sheets.Count() > 0); 
     } 
    } 

    actual.FileStream.Close(); 
    actual.FileStream.Dispose(); 
} 
Powiązane problemy