Тестирование со случайными данными

На с# делаю машину состояний в форме черного ящика. Создается набор состояний, между ними настраиваются переходы, для переходов прописываются условия когда они срабатывают. Среди прочих свойств перехода есть такой параметр как вероятность срабатывания перехода. В момент расчета текущего состояния, перебираются все существующие переходы и если найден допустимый, то через Random проверяется сработал он или нет.

Параллельно пишу юниттесты, которые проверяют работу черного ящика. Вот задумался как проверить, что случайный переход сработает. Пока только такой вариант приходит в голову: создаем состояния 0 - 1 - 2. Начинаем с 0 и из него делаем переходы в 1 и 2 с вероятностью 0.5. Дальше в цикле запускаем машину несколько раз (много, скажем 100) и подсчитываем в каком состояния машина оказалась. В итоге счетчик по состояниям 1 и 2 не должен быть 0. Получается а-ля подсчет подбрасывание монеты орел/решка.

[TestMethod]
  public void WhenTransition_WithChance_ThenOk()
  {
    var builder = SimpleMachine<int>.Create(states: new[] { 0, 1, 2 }, initState: 0);
    builder.FinalStates(1, 2);
    builder.In(0).To(1, chance: 0.5f);
    builder.In(0).To(2, chance: 0.5f);
    var machine = builder.Complete();

    int cnt1 = 0; 
    int cnt2 = 0;
    int totalCheck = 100;

    machine.Change(() =>
    {
      if (machine.Current == 1) cnt1++;
      if (machine.Current == 2) cnt2++;
    });

    for (int i = 0; i < totalCheck; i++)
    {
      machine.Start();
      Thread.Sleep(100); //ждем пока сменит состояние
      if (machine.Current == 0) // если оба перехода не сработали останавливаем машину, чтобы запустить ее по новой
        machine.Stop();
      machine.IsWork.Should().Be(false);
    }

    cnt1.Should().BeGreaterThan(0);
    cnt2.Should().BeGreaterThan(0);
    (cnt1 + cnt2).Should().BeLessOrEqualTo(totalCheck);
  }

Может кто посоветует еще варианты как можно тест для подобного случая написать, когда есть черный ящик и на выходе имеешь только входные и выходные данные, не влезая в его работу изнутри? Смущает, что не можешь быть уверен в 100% результате теста.


Ответы (0 шт):