{"id":37051210,"url":"https://github.com/gcastellov/fluent-endurance","last_synced_at":"2026-01-14T05:55:12.299Z","repository":{"id":55592487,"uuid":"320918900","full_name":"gcastellov/fluent-endurance","owner":"gcastellov","description":"A fluent endurance automation framework whose API helps you to fluently create your endurance tests defining repetitions and timeouts.","archived":false,"fork":false,"pushed_at":"2025-09-08T06:45:58.000Z","size":1570,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-10T06:23:52.937Z","etag":null,"topics":["automation","csharp","endurance","fluent","test","xunit-tests"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gcastellov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-12-12T20:35:15.000Z","updated_at":"2025-09-02T16:02:46.000Z","dependencies_parsed_at":"2022-08-15T03:50:56.533Z","dependency_job_id":null,"html_url":"https://github.com/gcastellov/fluent-endurance","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/gcastellov/fluent-endurance","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcastellov%2Ffluent-endurance","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcastellov%2Ffluent-endurance/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcastellov%2Ffluent-endurance/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcastellov%2Ffluent-endurance/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gcastellov","download_url":"https://codeload.github.com/gcastellov/fluent-endurance/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcastellov%2Ffluent-endurance/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28412047,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T05:26:33.345Z","status":"ssl_error","status_checked_at":"2026-01-14T05:21:57.251Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","csharp","endurance","fluent","test","xunit-tests"],"created_at":"2026-01-14T05:55:11.674Z","updated_at":"2026-01-14T05:55:12.293Z","avatar_url":"https://github.com/gcastellov.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# FluentEndurance\nA fluent endurance automation framework whose API helps you to fluently create your endurance tests defining repetitions and timeouts. \n\n![FluentEndurance](img/logo512x512.png)\n\n## Samples\nFor the sake of providing some examples, the solution contains set of tests which simulates certain car features.\n\nIn the following snippet the engine must start within 1200 ms and stop within 800 ms. If any of these two operation reach the timing the execution fails. This set of operations will repeat for 50 times. \n\n```csharp\n[Fact]\npublic Task EngineShouldStartAndStop()\n    =\u003e UseFeatureSetGroup().For(Times.As(50))\n        .WithSet(group =\u003e group.Create()\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Start(ct), Milliseconds.As(1200))\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Stop(ct), Milliseconds.As(800)))\n        .Run();\n```\n\nWhich outputs:\n```\nExecuted engine.Start(ct) taking 1007.4665 ms\nExecuted engine.Stop(ct) taking 60.9244 ms\nExecuted engine.Start(ct) taking 1002.506 ms\nExecuted engine.Stop(ct) taking 58.2176 ms\n...\n```\n\nTimespans can be used in order to define how long the operations must take instead of repeating them certain times.\n\n```csharp\n[Fact]\npublic Task EngineShouldStartRevAndStopDuringTime()\n    =\u003e UseFeatureSetGroup().During(Minutes.As(1))\n        .WithSet(group =\u003e group.Create().During(Seconds.As(20))\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Start(ct))\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Rev3000(ct))\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Stop(ct)))\n        .Run();\n```\n\nAnother more complete sample.\n\n```csharp\n[Fact]\npublic Task CarShouldMakeItsRoutineTwice()\n    =\u003e UseFeatureSetGroup().For(Times.As(2))\n        .WithSet(group =\u003e group.Create().As(\"Warm up\")\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Start(ct))\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Rev3000(ct)))\n        .WithSet(group =\u003e group.Create().As(\"Routine\")\n            .WithStep(_autopilotFeature, (autopilot, ct) =\u003e autopilot.UnPark(ct))\n            .WithStep(_gearsFeature, (gears, ct) =\u003e gears.ChangeToNeutral(ct))\n            .WithStep(_gearsFeature, (gears, ct) =\u003e gears.ChangeToDrive(ct)))\n        .WithSet(group =\u003e group.Create().As(\"Maneuvers\").For(Times.Twice)\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Accelerate100(ct))\n            .WithStep(_autopilotFeature, (autopilot, ct) =\u003e autopilot.Drive(ct))\n            .WithStep(_steeringFeature, (steering, ct) =\u003e steering.Left(ct))\n            .WithStep(_steeringFeature, (steering, ct) =\u003e steering.Forward(ct))\n            .WithStep(_steeringFeature, (steering, ct) =\u003e steering.Right(ct))\n            .WithStep(_steeringFeature, (steering, ct) =\u003e steering.Forward(ct))\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Accelerate150(ct))\n            .WithStep(_brakesFeature, (brakes, ct) =\u003e brakes.BrakeTo50(ct))\n            .WithStep(_autopilotFeature, (autopilot, ct) =\u003e autopilot.Drive(ct))\n            .WithStep(_brakesFeature, (brakes, ct) =\u003e brakes.BrakeTo0(ct)))\n        .WithSet(group =\u003e group.Create().As(\"Park\")\n            .WithStep(_engineFeature, (engine, ct) =\u003e engine.Stop(ct))\n            .WithStep(_autopilotFeature, (autopilot, ct) =\u003e autopilot.Park(ct)))\n        .Run();\n```\n\n## Output status\n\nThere are two ways of collecting notifications:\n* Live notifications by subscribing to these events. \n* Reading the events each feature has triggered at the end of the test execution.\n\n\n### Live notifications using notification handlers\n```csharp\npublic MotionTests(ITestOutputHelper output)\n    : base(\n        _ =\u003e { }, \n        services =\u003e\n        {\n            var notificationHandler = new StatusNotificationHandler();\n            notificationHandler.Write += output.WriteLine;\n            services.AddSingleton\u003cINotificationHandler\u003cStatusNotification\u003e\u003e(notificationHandler);\n            services.AddSingleton\u003cINotificationHandler\u003cPerformanceStatusNotification\u003e\u003e(notificationHandler);\n        })\n{\n    // ...\n}\n```\n\n### Reading feature events\n```csharp\npublic Task DisposeAsync()\n{\n    foreach (var notification in _engineFeature.Notifications)\n    {\n        _output.WriteLine(notification.Content);\n    }\n\n    return Task.CompletedTask;\n}\n```\n\n## License\nThis project is licensed under the terms of the MIT license. \nCheck the [LICENSE](LICENSE.md) file out for license rights and limitations.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgcastellov%2Ffluent-endurance","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgcastellov%2Ffluent-endurance","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgcastellov%2Ffluent-endurance/lists"}