{"id":5503,"date":"2007-09-06T14:24:00","date_gmt":"2007-09-06T14:24:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2007\/09\/06\/qa-gauntlet\/"},"modified":"2019-02-18T18:54:22","modified_gmt":"2019-02-18T18:54:22","slug":"qa-gauntlet","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/qa-gauntlet\/","title":{"rendered":"QA Gauntlet"},"content":{"rendered":"<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Hello.<span>&nbsp; <\/span>I&rsquo;m Rob Huyett, an SDET on the VC Libraries team.<span>&nbsp; <\/span>My topic for today isn&rsquo;t really anything about new technology, or the wonders of Orcas, or anything like that.<span>&nbsp; <\/span>It&rsquo;s really just to give you all a little view of how things work around here.<span>&nbsp; <\/span>I&rsquo;m writing today to talk about one of the tools we use to help keep our test quality high, our QA Gauntlet or &ldquo;QuAG&rdquo;.<span>&nbsp; <\/span>What exactly is a &ldquo;gauntlet&rdquo; tool, you ask?<span>&nbsp; <\/span>Well, a gauntlet puts any changes through a battery of tests to make sure that the change is robust and doesn&rsquo;t break anything.<span>&nbsp; <\/span>The name comes from the term &ldquo;running the gauntlet,&rdquo; though I&rsquo;ll leave it up to you whether you&rsquo;d like to look up the historical origins of the phrase.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">QuAG is one of several gauntlets in use around here.<span>&nbsp; <\/span>It differs from the others in that it&rsquo;s been customized to test our tests, rather than test VC itself.<span>&nbsp; <\/span>It&rsquo;s pretty common for us to have to update our tests.<span>&nbsp; <\/span>For instance, as VC itself changes, sometimes the tests also need to change to accommodate the new VC behavior. <span>&nbsp;<\/span>Other times, the test just simply has a bug that needs to be fixed.<span>&nbsp; <\/span>Regardless, we want to ensure that updating our tests doesn&rsquo;t cause any unexpected problems.<span>&nbsp; <\/span>Running all of the required test permutations by hand would be horribly time-consuming, though, and that&rsquo;s where QuAG comes in.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">QuAG consists of a server and about a dozen or so client machines.<span>&nbsp; <\/span>The client machines include representatives from each of the three supported architectures (x86, x64, and ia64).<span>&nbsp; <\/span>After an SDET makes their changes to a test and is ready to check the changes into source control, he submits the changes to QuAG.<span>&nbsp; <\/span>The QuAG server then assigns different test scenarios to different client machines.<span>&nbsp; <\/span>The exact number of test scenarios will vary a bit depending on the exact change being made, but a typical breakdown of scenarios might be x86-native, x64-native, ia64-native, x86-pure, x64-pure, etc.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">The client machines all do their work in parallel, and the server keeps track of them all.<span>&nbsp; <\/span>When all of the clients report that they have finished (which can take anywhere from a few minutes to a few hours, depending on the tests being evaluated and the state of the client machines), the server looks through the results to see if everything is as it should be.<span>&nbsp; <\/span>If all is well, then the change is automatically checked in to source control, and an e-mail is sent out informing the team of the checkin.<span>&nbsp; <\/span>If something doesn&rsquo;t meet expectations, then e-mail is sent to the SDET who submitted the test as well as the QuAG admins so that the problem can be investigated and resubmitted.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Of course, all of this takes a quite a bit of work to maintain.<span>&nbsp; <\/span>There are over a dozen machines that need to be maintained and kept up-to-date.<span>&nbsp; <\/span>The QuAG software consists of a lot of small (and not-so-small) scripts and programs in a variety of languages (mostly batch files and perl scripts).<span>&nbsp; <\/span>In fact, one of our goals for once Orcas is out the door is to take a look at QuAG and try to give it a bit of a tune-up to reduce the maintenance overhead.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">As always, your comments and questions are appreciated.<span>&nbsp; <\/span>Thanks!<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Rob Huyett<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">VC Libraries Team<\/font><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello.&nbsp; I&rsquo;m Rob Huyett, an SDET on the VC Libraries team.&nbsp; My topic for today isn&rsquo;t really anything about new technology, or the wonders of Orcas, or anything like that.&nbsp; It&rsquo;s really just to give you all a little view of how things work around here.&nbsp; I&rsquo;m writing today to talk about one of the [&hellip;]<\/p>\n","protected":false},"author":289,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5503","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus"],"acf":[],"blog_post_summary":"<p>Hello.&nbsp; I&rsquo;m Rob Huyett, an SDET on the VC Libraries team.&nbsp; My topic for today isn&rsquo;t really anything about new technology, or the wonders of Orcas, or anything like that.&nbsp; It&rsquo;s really just to give you all a little view of how things work around here.&nbsp; I&rsquo;m writing today to talk about one of the [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/5503","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/289"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=5503"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/5503\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media\/35994"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media?parent=5503"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=5503"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=5503"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}