From 130df8d5886b8ad409a0298dfe10e91eafc396d8 Mon Sep 17 00:00:00 2001 From: i0natan Date: Tue, 12 Feb 2019 20:50:50 +0200 Subject: [PATCH] fsd --- docs/basic-flow.png | Bin 0 -> 41406 bytes readme.md | 12 +++++++----- .../manual-testing-with-simple-web-app/index.js | 3 +++ 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 docs/basic-flow.png diff --git a/docs/basic-flow.png b/docs/basic-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..0dccadd1ff46604f8c9c75072b90aff7bdd4cdd6 GIT binary patch literal 41406 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

cK6qT~JlJ=i5~tSoeL&FiF*% zG>nvV^vUlQsTq||d~(#zem{WRoR)#Zp(K@NlYhh1g31D2o|Wd35AzE!T`8(v2>g zAO$t{YbYSyP=RDS8 zMAAWWzYg8FPnNcxle*eqssy#)nHE)0Nri!aUX@;?@bWgOmeV=|R4n@CCpZBTRA^hu z%biQ=*Rj;|Ir~DTt?xeIYqhF=&^}zrEqa!vg>r=FQB+*>i4+33ly+K;zXw5^-`G^( zbEpT^`+)I$#i!CHEO+ne_v=U+zk?L90K5=7D7p=+9Do-*mEr-DRpdC3?xrn@T8v-b zSuXm4Iq*l>1O9X%Yc@%aiPq>kiu!S^F#02OI{I>c^pSUw7y}&sO@W`g`qOn4&%5d4 zYJIylObMj~SoYwZ-rybAE`g{$fQ0?f2rh&kgJv^n&&Unlv5v{ZNDk8;v_??-GjVetB;1UP}SKk({2V0;R07uSA%5vvW%x44_H;r)Z^_Zqeb zr0x#!oq?o~1{4O$(E)b*ro)iS-}^q68k|W6t~!;VB$fs?*E2T6k_fDFe^;F8(GlpsNPcnC$?S zO5nEuaKz1q3<}QuTzB!n+<;Fl`lUf~Xo@-O+v=P>ehO7$<@qRl%vcC^L? z6ya+mO?#sFk_}u_-9Z{;>(1xHGqQ5zYQ%Et@4z&B05yj< z7E8lZYFcc`P0}sgoTqwQ*PiFGblk;z?%u`v*cm{1EkJF&_WbsG;a-@SRhbtqTezlJ|Zs9!9P17d^v#u!WN3k_ury4%7Ky|;XzK`@H2N&G%s|hMYIgp=pewG2J ze<}bgj_CtyXþ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 f*R@J|@gBkIscjuQYjzC+_)p=P%F_~Aqk#VfI -## Don't go to production without 10 minutes of chaos testing +## Don't go to production without 10 minutes of application-level chaos testing > "A software QA engineer walks into a bar > @@ -20,10 +20,10 @@ > >Credit @brenankeller -Functional bugs are just a subset of the bad things that happen in production. In reality, unplanned chaos will affect your application reliability. How? your process will crash, many exceptions will not get caught, some unknowns will slow your API, other unknowns will increase your error rate. To name a few. +Functional bugs are just a subset of the bad things that happen in production. In reality, unplanned chaos will affect your application reliability. How? your process will crash, the event loop might get blocked, many exceptions will not get caught, some unknowns will slow your API, other unknowns will increase your error rate. To name a few. **Unlike most chaos tools, our project is focused on application-level chaos and specifically bad things that happen in Node.js applications**. Deploy like a pro by spending as little as 10 minutes on Chaos Testing: - + **1.** Simulate some bad things (e.g. event loop is blocked) **2.** Approach your APIs to ensure they function correctly @@ -32,6 +32,8 @@ Deploy like a pro by spending as little as 10 minutes on Chaos Testing: **We can seamlessly perform the two first tasks for you using our nit UI or command line** + + ## 3 min start ### Great for quick experiments, some pranks (damage) won't be available @@ -46,7 +48,7 @@ C. **Trigger chaos using API or UI**: This will trigger a random chaos, multiple pranks will get executed (e.g. memory overload, uncaught exceptions). Follow the log or the UI to see whatg happened and whether your app stayed resillience -# 5 min start (full functionality) +## 5 min start (full functionality) A. **Install:** `npm install node-chaos-monkey` B. **Add a reference in your code:** @@ -55,7 +57,7 @@ Require this package at the very beginning of your app, before registering other ```javascript const ChaosMonkey = require('chaos-monkey'); -//pass in a referrence to express app so the monkey can generate damage also within Express routes. This param is optional //but without it some pranks won't be available +//pass in a reference to express app so the monkey can generate damage also within Express routes. This param is optional //but without it some pranks won't be available ChaosMonkey.initialize(your-express-app); ``` diff --git a/tests/manual-testing-with-simple-web-app/index.js b/tests/manual-testing-with-simple-web-app/index.js index 5952e76..c551d89 100644 --- a/tests/manual-testing-with-simple-web-app/index.js +++ b/tests/manual-testing-with-simple-web-app/index.js @@ -1,10 +1,13 @@ +//I wish I could drop this line const ChaosMonkey = require("../.."); + const express = require("express"); const app = express(); const port = process.env.PORT || 8080; app.listen(port); +//I wish I could use also a command line -> chaos-monkey -f app.js --test-command='npm test' -r report.html ChaosMonkey.initialize(app); var router = express.Router();