UnitTesting для Akka.net актеры

Я пробую Akka.net - ... До сих пор я просто создал простое приложение в стиле HelloWorld. Обычно я использую TDD-подход в своей разработке, но с Akka.net я не знаю, с чего начать модульное тестирование.

после некоторого googling я понял, что оригинальная Java / Scala Akka framework использует выделенный модуль akka-testkit который, кажется, недоступен в порту .Net.

кто-нибудь (особенно ребята из markedup.com) нашел способ сделать модульное тестирование для актеры?

4 ответов


[редактирование] Теперь есть более полный и лучший пост о том, как сделать модульное тестирование с помощью Akka.NET здесь https://petabridge.com/blog/how-to-unit-test-akkadotnet-actors-akka-testkit/

[старый] Акка.Testkit были портированы, и мы намерены опубликовать его на Nuget очень скоро. Если вы хотите попробовать его уже, вы должны загрузить источник изhttps://github.com/akkadotnet/akka.net

лучший способ начать работу-это проверить наши собственные модульные тесты внутри Akka.NET - ... Есть спецификации, перенесенные из JVM с помощью Akka.Testkit, это должно дать несколько хороших примеров того, как тестировать системы акторов.

например см.: https://github.com/akkadotnet/akka.net/blob/dev/src/core/Akka.Tests/Actor/ActorLifeCycleSpec.cs#L116


в настоящее время я работаю над документами для TestKit (должен быть жить на следующей неделе), но в то же время, я бы предложил проверить это тщательное вступление к TestKit. Он охватывает основные и расширенные функции API, включая тестирование различных шаблонов hiearchy, асинхронных вызовов, виртуального времени, запланированных сообщений и т. д. (раскрытие: я написал это).


Я разрабатываю торговую платформу с использованием Akka.NET, мой набор тестов написан с помощью xunit2 framework и реализует Akka.NET Тесккит.

Акка.TestKit используется в качестве базового класса, который позволяет создавать экземпляры Sys.Актороф. Это фактически поддельная система ActorSystem согласно ссылкам, я создаю поддельную CommandBus( пример в нижней части сообщения), очень маленький ReceiveActor, который просто захватывает любые сообщения, отправленные тестируемым классом SignalProcessorExit (который моделируется Тестактором, который отправляет любые сообщения обратно себе). Затем содержимое сообщения можно изучить, чтобы проверить поведение актеров (поэтому я не заглядываю внутрь самого актера, просто проверяя его поведение). Сначала я нашел этот счетчик интуитивно понятным, но как только вы привыкнете к тому, как работает Тестактор, все становится проще.

конструктор создает Свежее Приспособление для каждого теста, который включает в себя разрушения и восстановления Системный.ActorOf тест Акторсистемы.

Я использую ExpectNoMsg () и ExpectMsg (T) здесь, чтобы захватить сообщение, полученное Тестактором, и сделать утверждения на его основе.


С помощью TestKit кажется, рекомендуемая и "официальная" практика. Но вы можете проверить актера только в его полном поведении, как часть "поддельной" системы (тестовой системы).

Я могу сопротивляться этому только потому, что я начинаю с актеров, но это не кажется мне правильным. Я хочу/должен модульно протестировать методы моего актера индивидуально, а не как часть системы.

Итак, то, что я делал до сих пор, забирает логическую часть актер и государство в другом классе, который я могу модульный тест по желанию, и имея экземпляр этого класса в реальном актере akka. Вы даже можете сопоставить свойства и методы, Если вы хотите абстрагироваться от этого.

Я видел, что это рекомендуется здесь для akka на Scala:Как протестировать публичный метод в актере akka?, но это относится к akka.net.

при тестировании актера как части системы имеет смысл, мои требования к модульному тестированию конфликтуют с этим.

мой пример: я создавал актера, который получал данные из сети вызов и обновление пользовательского интерфейса, если эти данные изменились определенным образом. Сейчас общий подход к тестированию обработки данных с помощью TestKit будет мне нужно либо заставить актера ответить на сообщение с его новыми данными (не мое намерение сначала), или сделать несколько вызовов для каждого изменения сценарий-и тогда обработка данных будет протестирована совместно с государственным сравнением. Мне тоже не нравится. изменение поведения просто разрешить тестирование или тестирование 2 или более различных частей актера.

поэтому я сделал, как я объяснил, извлек логический класс, который обрабатывает каждый тип сообщения в другом методе. Я могу проверить обработку данных, я могу изменить состояние и проверить методы сравнения состояний. Так намного чище.

наконец, если вы играете с akka, вам нужно использовать TestKit. Вы захотите проверить полное поведение актера. Но мне все еще нужно ... более детальное тестирование и интересно, почему это невозможно для новых актеров, чтобы сделать именно это (хотя я понимаю, что это никогда не должно быть сделано из контекста тестирования).