Programowanie reaktywne w jezyku Scala


Uzycie akka testkit w ScalaTest

  • Jako narzędzia do testowania używamy ScalaTest
  • ScalaTest oferuje różne style testowania czyli sposoby deklarowania testów. W przykładzie wykorzystano naturalny styl WordSpec (trait WordSpecLike)
  • Trait BeforeAndAfterAll zapewnia funkcje do wykonania przed i po zestawie testów. W przykładzie pokazano, jak wykorzystać funkcje afterAll do zamknięcia systemu aktorów po zakonczeniu testów.

Testowanie aktorów

Do testowania aktorów wykorzystujemy moduł akka-testkit. W przykładzie rozszerzana jest klasa TestKit inicjalizowana systemem aktorów do testowania.
  1. Testowanie aktora w jednym wątku. Testowanie stanu wewnętrznego aktora może odbywać się przy pomocy TestActorRef, wtedy aktor jest wywoływany w tym samym wątku, co cały test, ale dzięki temu możemy bezpiecznie przetestować zmiany jego wewnętrznego stanu. Przykład testowania wewnętrznego stanu licznika.
  2. Wielowątkowe testowanie poprzez wiadomości .
    • Akka TestKit tworzy wewnętrznego testującego aktora (o nawie testActor), który służy do komunikacji z testowanymi aktorami
    • Odpowiedzi od testowanych aktorów są kolejkowane przez testującego aktora i mogą być badane przy użyciu asercji takich jak expectMsg.
    • Jeśli aktor wysyła wiadomości do więcej niż jednego aktora możemy przetestować to używając mechanizmu TestProbe.
    • Uzycie traitu ImplicitSender powoduje, że aktor testujący jest domyślnie używany jako ten, który wysyła wiadomości do testowanych aktorów.
    • Przykład testuje aktora Toggle z poprzedniego przykladu z laboratorium 2
    • W zestawie zawarte są trzy testy w stylu WordSpec

Jak uruchomić testy?

  • Pobrać projekt potrzebny do wykonania ćwiczenia.
  •   git clone https://github.com/agh-reactive/reactive-lab3
    
  • Przykłady testów znajdują sie w katalogu src/test/scala/myActorTest/
  • uruchomienie programów znajdujacego sie w src/main/scala:
    sbt run
  • uruchamienie testowanie za pomocą ScalaTest:
    sbt test
  • Dla korzystających z IDE: Opis uruchamiania testów w IntelliJ IDEA

Zadanie

Szablon do zadań z Laboratorium 3: https://github.com/agh-reactive/reactive-scala-labs-templates/tree/lab-3 (proszę pamiętać o scaleniu rozwiązań z laboratorium numer 2)
  1. (20 pkt)
    • Prosze dodać do systemu aukcyjnego aktorow OrderManager i Payment, a następnie utworzyć system aktorów działający zgodnie z diagramem:

    • Napisać testy dla aktora CartActor. Testy powinny zawierać:
      • testowanie synchroniczne - test zmiany zawartości koszyka przy użyciu TestActorRef
      • testowanie asynchroniczne za pomocą aktora testActor i asercji typu expectMsg.
      alternatywnie:

  2. (10 pkt) Wykorzystując Akka TestKit proszę napisac testy dla aktora Checkout zawierające reakcję na komunikaty wg diagramu poniżej. Zestaw powinien zawierać test relacji rodzic-dziecko w szczególności sprawdzenie, czy CartActor dostaje komunikat CheckoutClosed od testowanego aktora CheckOut (patrz diagram)

  3. (10 pkt)

    Uwaga 1: to zadanie ma dwie wersje -- dla typowanej i klasycznej wersji aktora OrderManager. Wybrać należy jedno z poniższych zadań, w zależności od wybranej implementacji.

    Uwaga 2: rozwiązanie tego zadania powinno być zrealizowane w osobnej gałęzi (szczegóły w instrukcji do przesyłania zadania).

    • (Dla implementacji typowanej) Proszę w aktorze TypedOrderManager zastosować wzorzec Adapted Response. Wskazówka: aktorzy (np. Checkout) powinni wysyłać odpowiedzi w formie zdarzeń (np. CheckoutClosed), a adapter może je mapować na już wiadomości już zdefiniowane, np. ConfirmCheckoutClosed.
    • (Dla implementacji klasycznej) Proszę przetestować mieszanie aktorów klasycznych (OrderManager) i typowanych (TypedCartActor i TypedCheckout. Więcej informacji: coexistence


Bartosz Baliś, balis at agh edu pl
Maciej Malawski, malawski at agh edu pl
Katarzyna Rycerz, kzajac at agh edu pl
Krzysztof Borowski, kborowski at agh edu pl