ALM Rangers – Raising the Quality Bar for Tooling (Part 1)
When you ask the most pedantic and quality driven ALM Ranger to help you raise the quality bars, you are setting yourself up for an Epic adventure
Jokes aside, Michael Fourie has not only been instrumental in the new ALM ranger documentation templates, but has become a feared reviewer for tooling and sample code. The former will be covered in a future blog post when we release the new Branching and Merging Guide, based on the new templates and styling. The latter, sample and tooling code review, is the focus of attention in this post.
The feared feedback
One N/A, one pass and five fails … not a result that is wished for, but one that shows just how pedantic (detailed and precise) the code review and how the quality bar has been set.
Basic checklist
Our ALM Rangers Practical Ruck Training and Reference Manual outlines the process and checklists for all types of projects. The following image shows the checklist for Tooling projects, also used for selected sample code.
What does it all mean?
Structural
The quality checks are made against the structure of the solution, whereby the image on the right shows the structure of the sample template solution that is included with the Ruck Guide.
1 - Namespace Allocation
All ALM Rangers code must make itself comfortable within the Microsoft.ALMRangers namespace.
Example –> Microsoft.ALMRangers.BranchTool.CmdLineParser;
2 - Linked Standard Files
The standard files are included with the latest ALM Ranger templates and linked by solutions to inherit a consistent code analysis dictionary and common assembly information.
- ALMRangersCodeAnalysisDictionary.xml
- ALMRangersCommonAssemblyInfo.cs
Example: See code snippets at the end of this post.
3 - Local Standard Files
Each solution should contain 1 or more AssemblyInfo.cs files (example included at the end of post) which defines the title, description, product and version information.
Example: See code snippets at the end of this post.
Quality Gate
The second set of quality checks are concerned with the code itself and create most of the review errors and associated headaches.
4 - Code Analysis enabled in Release mode.
Code Analysis must be enabled in Release mode.
?5 - ALMRangersRuleSet.ruleset
The solution projects must use the ALMRangersRuleSet.ruleset, which is listed at the end of this post.
6 - StyleCop
The solution code must pass StyleCop.
See https://stylecop.codeplex.com for more information.
7 - ReSharper
ReSharper compliance is an optional, but recommended check. See https://www.jetbrains.com/resharper/ for information on ReSharper.
What’s the impact?
- We get to know the pedantic side of Michael Fourie when we ask him to do a “quick” review … there is only thorough and detailed in Mike’s vocabulary.
- Teams are usually faced with a (FAIL) and
- Teams then go into a quality improvement cycle.
- Eventually getting a and shipping much better quality
Source Code Samples
ALMRangersCodeAnalysisDictionary.xml
1: <?xml version="1.0" encoding="utf-8" ?>
2: <Dictionary>
3: <Words>
4: <Recognized>
5: <Word>Changeset</Word>
6: <Word>Changesets</Word>
7: <Word>Tfs</Word>
8: <Word>TFS</Word>
9: </Recognized>
10: <Unrecognized>
11: <Word>StyleCop</Word>
12: <Word>SourceFiles</Word>
13: </Unrecognized>
14: <Compound>
15: <Term CompoundAlternate="StyleCop">Stylecop</Term>
16: <Term CompoundAlternate="SourceFiles">Sourcefiles</Term>
17: </Compound>
18: </Words>
19: <Acronyms>
20: <CasingExceptions>
21: <Acronym>AWS</Acronym>
22: <Acronym>SSH</Acronym>
23: </CasingExceptions>
24: </Acronyms>
25: </Dictionary>
ALMRangersCommonAssemblyInfo.cs
1: // <copyright file="AssemblyInfo.cs" company="Microsoft Corporation">
Copyright © Microsoft Corporation. All Rights Reserved. This code released under the
terms of the Microsoft Public License (MS-PL, https://opensource.org/licenses/ms-pl.html.)
This is sample code only, do not use in production environments</copyright>
2: using System.Reflection;
3:
4: [assembly: AssemblyCompany("Microsoft Corporation")]
5: [assembly: AssemblyCopyright("Copyright © Microsoft Corporation")]
6: [assembly: AssemblyTrademark("Microsoft Visual Studio ALM Rangers")]
AssemblyInfo.cs
1: // <copyright file="AssemblyInfo.cs" company="Microsoft Corporation">
Copyright © Microsoft Corporation. All Rights Reserved. This code released under the
terms of the Microsoft Public License (MS-PL, https://opensource.org/licenses/ms-pl.html.)
This is sample code only, do not use in production environments</copyright>
2: using System.Reflection;
3:
4: [assembly: AssemblyTitle("Microsoft ALM Rangers ASSEMBLYTITLE")]
5: [assembly: AssemblyDescription("Microsoft ALM Rangers ASSEMBLYDESCRIPTION")]
6: [assembly: AssemblyProduct("Microsoft ALM Rangers PRODUCTNAME")]
7: [assembly: AssemblyVersion("1.0.0.0")]
8: [assembly: AssemblyFileVersion("1.0.0.0")]
ALMRangersRuleSet.ruleset
1: <?xml version="1.0" encoding="utf-8"?>
2: <RuleSet Name="ALM Rangers Rule Set" Description="These rules are a suggested minimal
set to comply with for ALM Rangers code deliverables" ToolsVersion="11.0">
3: <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
4: <Rule Id="CA1301" Action="Error" />
5: <Rule Id="CA1400" Action="Error" />
6: <Rule Id="CA1401" Action="Error" />
7: <Rule Id="CA1403" Action="Error" />
8: <Rule Id="CA1404" Action="Error" />
9: <Rule Id="CA1405" Action="Error" />
10: <Rule Id="CA1410" Action="Error" />
11: <Rule Id="CA1415" Action="Error" />
12: <Rule Id="CA1821" Action="Error" />
13: <Rule Id="CA1900" Action="Error" />
14: <Rule Id="CA1901" Action="Error" />
15: <Rule Id="CA2002" Action="Error" />
16: <Rule Id="CA2100" Action="Error" />
17: <Rule Id="CA2101" Action="Error" />
18: <Rule Id="CA2108" Action="Error" />
19: <Rule Id="CA2111" Action="Error" />
20: <Rule Id="CA2112" Action="Error" />
21: <Rule Id="CA2114" Action="Error" />
22: <Rule Id="CA2116" Action="Error" />
23: <Rule Id="CA2117" Action="Error" />
24: <Rule Id="CA2122" Action="Error" />
25: <Rule Id="CA2123" Action="Error" />
26: <Rule Id="CA2124" Action="Error" />
27: <Rule Id="CA2126" Action="Error" />
28: <Rule Id="CA2131" Action="Error" />
29: <Rule Id="CA2132" Action="Error" />
30: <Rule Id="CA2133" Action="Error" />
31: <Rule Id="CA2134" Action="Error" />
32: <Rule Id="CA2137" Action="Error" />
33: <Rule Id="CA2138" Action="Error" />
34: <Rule Id="CA2140" Action="Error" />
35: <Rule Id="CA2141" Action="Error" />
36: <Rule Id="CA2146" Action="Error" />
37: <Rule Id="CA2147" Action="Error" />
38: <Rule Id="CA2149" Action="Error" />
39: <Rule Id="CA2200" Action="Error" />
40: <Rule Id="CA2202" Action="Error" />
41: <Rule Id="CA2207" Action="Error" />
42: <Rule Id="CA2212" Action="Error" />
43: <Rule Id="CA2213" Action="Error" />
44: <Rule Id="CA2214" Action="Error" />
45: <Rule Id="CA2216" Action="Error" />
46: <Rule Id="CA2220" Action="Error" />
47: <Rule Id="CA2229" Action="Error" />
48: <Rule Id="CA2231" Action="Error" />
49: <Rule Id="CA2232" Action="Error" />
50: <Rule Id="CA2235" Action="Error" />
51: <Rule Id="CA2236" Action="Error" />
52: <Rule Id="CA2237" Action="Error" />
53: <Rule Id="CA2238" Action="Error" />
54: <Rule Id="CA2240" Action="Error" />
55: <Rule Id="CA2241" Action="Error" />
56: <Rule Id="CA2242" Action="Error" />
57: </Rules>
58: </RuleSet>
Comments
- Anonymous
October 17, 2012
The comment has been removed