<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code Quality &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<atom:link href="https://myifew.com/tag/code-quality/feed/" rel="self" type="application/rss+xml" />
	<link>https://myifew.com</link>
	<description></description>
	<lastBuildDate>Thu, 20 Dec 2018 09:28:34 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://myifew.com/wp-content/uploads/2018/07/cropped-logo6-ts-32x32.png</url>
	<title>Code Quality &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<link>https://myifew.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>มาลอง Code Coverage บน  .Net Core 2+ ด้วย coverlet</title>
		<link>https://myifew.com/5145/code-coverage-on-net-core-2-via-coverlet/</link>
					<comments>https://myifew.com/5145/code-coverage-on-net-core-2-via-coverlet/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Thu, 20 Dec 2018 09:09:35 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[Automation Testing]]></category>
		<category><![CDATA[Automation Tools]]></category>
		<category><![CDATA[Code Coverage]]></category>
		<category><![CDATA[Code Quality]]></category>
		<category><![CDATA[Testing Tools]]></category>
		<category><![CDATA[Unit Test]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5145</guid>

					<description><![CDATA[ใครที่เขียนโค้ดด้วย .Net Core 2+ และทำ CI/CD บน Linux ค่อนข้างยุ่งยากหน่อย เพราะหาเครื่องมือสำหรับตรวจสอบ Code Coverage ฟรีๆ ดีๆ ได้น้อยเหลือเกิน ที่ผมเคยใช้ดีๆ ก็มี minicover&#8230;]]></description>
										<content:encoded><![CDATA[
<p>ใครที่เขียนโค้ดด้วย .Net Core 2+ และทำ CI/CD บน Linux ค่อนข้างยุ่งยากหน่อย เพราะหาเครื่องมือสำหรับตรวจสอบ Code Coverage ฟรีๆ ดีๆ ได้น้อยเหลือเกิน ที่ผมเคยใช้ดีๆ ก็มี <a rel="noreferrer noopener" aria-label="minicover (opens in a new tab)" href="https://github.com/lucaslorentz/minicover" target="_blank">minicover</a> จนเพิ่งมาลองเล่นอีกตัว ชื่อ <a rel="noreferrer noopener" aria-label="coverlet (opens in a new tab)" href="https://github.com/tonerdo/coverlet" target="_blank">coverlet</a> ใช้งานได้ง่ายกว่าเยอะมาก เพราะมันทำงานร่วมกับ MSTest ได้เลย</p>



<span id="more-5145"></span>



<h2 class="wp-block-heading">วิธีติดตั้ง</h2>



<p>การใช้งานมี 2 แบบครับ คือใช้คำสั่ง coverlet ทำงานเลย ให้ติดตั้งด้วยคำสั่ง</p>



<pre class="wp-block-preformatted">dotnet tool install --global coverlet.console</pre>



<p>หรือทำงานผ่านคำสั่ง dotnet test ให้เพิ่ม nuget package ด้วยคำสั่ง</p>



<pre class="wp-block-preformatted">dotnet add package coverlet.msbuild</pre>



<h2 class="wp-block-heading">วิธีใช้งาน</h2>



<p>ในตัวอย่างนี้ โครงสร้างโปรเจ็คผมจะหน้าตาตามรูปภาพด้านล่าง และผมเข้าจะยกตัวอย่างคำสั่งทั้งหมดกรณีที่อยู่ในโฟลเดอร์ /tests/web.UnitTest/<br></p>



<figure class="wp-block-image is-resized"><img fetchpriority="high" decoding="async" src="https://myifew.com/wp-content/uploads/2018/12/netcore2-project-structure-453x1024.png" alt="" class="wp-image-5146" width="227" height="512"/></figure>



<p>ดังนั้น เมื่อต้องการดู Code Coverage ผ่านคำสั่ง coverlet</p>



<pre class="wp-block-verse">coverlet <strong>bin/Debug/netcoreapp2.1/api.dll</strong> --target "dotnet" --targetargs "<strong>test web.UnitTest.csproj --no-build</strong>" --output "<strong>../web.UnitTest.Results/Coverage.xml</strong>"&nbsp;--format <strong>opencover</strong></pre>



<p>ซึ่งตัวหนาคือข้อมูลของโปรเจ็คเราเอง โดยผู้อ่านสามารถแก้ไขตามที่จะนำไปใช้งานได้เลย</p>



<ul class="wp-block-list"><li><strong>bin/Debug/netcoreapp2.1/api.dll</strong> : คือ ที่อยู่ของไฟล์ Unit Test Binary ที่เรา Build มาแล้ว</li><li><strong>test web.UnitTest.csproj &#8211;no-build</strong> : คือ arguments เพื่อบอกว่าเราต้องการทดสอบด้วย MSTest ไปที่ File Project ไหน, และผมเพิ่มไปว่า ไม่ต้อง ทำการ build project ใหม่ เพราะผมสั่ง build ไปแล้ว (ถ้าใครไม่สั่ง build ก่อน ให้เอา &#8211;no-build ออกด้วยนะ)</li><li><strong>../web.UnitTest.Results/Coverage.xml</strong> : คือ ที่อยู่ของไฟล์ report ซึ่งผมให้ใช้เป็น Formet ของ OpenCover จึงจ้องมีนามสกุล .xml (ค่ามาตรฐาน ถ้าไม่ระบุ มันจะเป็น JSON)</li><li></li><li><strong>opencover</strong> : คือ Format ของไฟล์ report ที่เราจะนำไปใช้งานต่อ</li></ul>



<p>ลองมาดูการใช้งานผ่านคำสั่ง dotnet test แบบปกติบ้าง</p>



<pre class="wp-block-preformatted">dotnet test --no-restore --no-build --logger:"trx;LogFileName=Results.trx" --results-directory:"../web.UnitTest.Results" <strong>/p:CollectCoverage=true</strong> /p:CoverletOutput="<strong>../web.UnitTest.Results/Coverage.xml</strong>" /p:CoverletOutputFormat=<strong>opencover</strong></pre>



<p>ถ้าให้เดาค่าต่างๆ คงพอเดากันได้นะครับ ระบุเหมือนด้านบนเลย แต่คำสั่งหนึ่งที่ต้องมีเสมอคือ</p>



<pre class="wp-block-preformatted">/p:CollectCoverage=true </pre>



<p>เพื่อบ่งบอกว่า เราต้องการ Generate Code Coverage ออกมาด้วย</p>



<h2 class="wp-block-heading">การแสดงผล</h2>



<p>เมื่อรันคำสั่งตามด้านบนเรียบร้อยแล้ว จะได้หน้าตาประมาณนี้ครับ</p>



<figure class="wp-block-image"><img decoding="async" width="1200" height="540" src="https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-1200x540.png" alt="" class="wp-image-5147" srcset="https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-1200x540.png 1200w, https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-1024x461.png 1024w, https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-768x346.png 768w, https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-600x270.png 600w, https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06.png 1990w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<p>ความหมายที่ได้จากการแสดงผล คือ</p>



<ul class="wp-block-list"><li><strong>Module</strong> : ชื่อ System ที่มันทำการทดสอบ</li><li><strong>Method coverage</strong> : จำนวนของ Function/Method ที่ถูกเรียกใช้งาน</li><li><strong>Branch coverage</strong> : จำนวนของ Branch หรือเงื่อนไขใน if statement ถูกเรียกใช้งานทั้ง true และ false</li><li><strong>Line coverage</strong> : จำนวนของบรรทัดที่ถูกเรียกใช้งาน</li></ul>



<pre class="wp-block-preformatted"><em>อ้างอิงคำอธิบายจาก <a href="http://www.somkiat.cc/introduction-to-code-coverage/">http://www.somkiat.cc/introduction-to-code-coverage/</a></em></pre>



<h2 class="wp-block-heading">กำหนดคุณภาพ ด้วยการตั้ง Threshold</h2>



<p>คราวนี้ ถ้าเราอยากตั้งค่าว่า ถ้า Code Coverage เรามี Test ครอบคลุมต่ำกว่า xx% เราจะไม่ให้ผ่านการทดสอบ โดยเพิ่ม Argument ชื่อ threshold ลงไป ดังนี้ </p>



<p>ตัวอย่างด้วยคำสั่ง coverlet</p>



<pre class="wp-block-preformatted">coverlet bin/Debug/netcoreapp2.1/api.dll --target "dotnet" --targetargs "test web.UnitTest.csproj --no-build" --output "../web.UnitTest.Results/Coverage.json" <strong>--threshold 80</strong></pre>



<p>ตัวอย่างด้วยคำสั่ง dotnet test</p>



<pre class="wp-block-preformatted">dotnet test --no-restore --no-build --logger:"trx;LogFileName=Results.trx" --results-directory:"../web.UnitTest.Results" /p:CollectCoverage=true /p:CoverletOutput="../web.UnitTest.Results/Coverage.xml" /p:CoverletOutputFormat=opencover <strong>/p:Threshold=80 /</strong></pre>



<p>ซึ่งในตัวอย่างผมกำหนดว่า Coverage ทุกประเภทจะต้องเกิน 80% ถึงจะเรียกว่าผ่าน ถ้าต่ำกว่านั้นจะ Fail ทันที ดังรูปด้านล่าง</p>



<figure class="wp-block-image"><img decoding="async" width="1200" height="594" src="https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-1200x594.png" alt="" class="wp-image-5149" srcset="https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-1200x594.png 1200w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-1024x507.png 1024w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-768x380.png 768w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-600x297.png 600w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1.png 2134w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<p>และเราสามารถกำหนดเฉพาะ Coverage ได้ด้วย เช่นผมต้องการเช็คเฉพาะ Line Coverage ก็สามารถเพิ่ม Argument เข้าไป ดังนี้</p>



<p>ตัวอย่างด้วยคำสั่ง coverlet</p>



<pre class="wp-block-preformatted"><strong>--threshold-type line</strong></pre>



<p>ตัวอย่างด้วยคำสั่ง dotnet test</p>



<pre class="wp-block-preformatted"> <strong>/p:ThresholdType=line</strong></pre>



<p>ผลที่ได้คือ</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="509" src="https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-1200x509.png" alt="" class="wp-image-5150" srcset="https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-1200x509.png 1200w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-1024x434.png 1024w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-768x326.png 768w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-600x254.png 600w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type.png 2142w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>



<h2 class="wp-block-heading">สรุป</h2>



<p>ถ้าเทียบกับ minicover แล้ว ตัวนี้ค่อนข้างใช้งานง่าย ไม่ซับซ้อนมากนัก รองรับ .Net Core 2.2.1 ตัวล่าสุดด้วย และสามารถแจกแจงรายละเอียด ตาม Coverage Type ต่างๆ พร้อมออก Report ได้ เช่น json, lcov, opencover (xml file), cobertura (xml file) และ teamcity ถ้าสนในรายละเอียดมากกว่านี้ ไปดูได้ที่ Github ของผู้พัฒนาได้เลยครับ ที่ https://github.com/tonerdo/coverlet</p>



<p><em>Featured image from: https://www.aapnainfotech.com/test-coverage-much-testing-enough</em>/</p>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5145/code-coverage-on-net-core-2-via-coverlet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ตรวจสอบคุณภาพของ Code ด้วย SonarQube</title>
		<link>https://myifew.com/4139/continuous-code-quality-with-sonarqube/</link>
					<comments>https://myifew.com/4139/continuous-code-quality-with-sonarqube/#comments</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Sun, 20 Aug 2017 17:23:07 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Code Coverage]]></category>
		<category><![CDATA[Code Quality]]></category>
		<category><![CDATA[Code Smell]]></category>
		<category><![CDATA[SonarQube]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=4139</guid>

					<description><![CDATA[โปรแกรมเมอร์ส่วนใหญ่จะมุ่งมั่นพัฒนา Software ให้เสร็จตามเวลาที่กำหนด จนบางทีก็ละเลยแบบตั้งใจและไม่ได้ตั้งใจ ที่จะทำให้ Sorcecode ที่เขียน มีคุณภาพหรืออย่างน้อยก็ได้ตามมาตรฐานที่มันควรจะเป็น

เรื่องเหล่านี้บางคนอาจไม่ค่อยอินเท่าไร หากทำงานคนเดียว หรืองานที่เร่งด่วนมากๆ ("งานร้อน" นั่นหละ) โดยเฉพาะงานทำครั้งเดียวเสร็จ ส่ง รับเงิน แล้วก็แยกย้าย.. แต่กับอีกหลายคนที่ต้องทำงานเป็นทีม หรือมี QA , CTO, Team Lead คอยเข้ามาตรวจสอบการทำงานของ Software และ Review Code อยู่สม่ำเสมอ ก็คงต้องปวดหัวกลับมาแก้งานรายชั่วโมง จนไม่ต้องทำมาหากิน

วันนี้เลยเอาเครื่องมือว้าวๆ ตัวหนึ่งชื่อ SonarQube มาให้ลอง มันเป็นตัวที่ช่วยตรวจสอบคุณภาพของ Source Code ให้เราได้แบบอัตโนมัติ ]]></description>
										<content:encoded><![CDATA[<p>โปรแกรมเมอร์ส่วนใหญ่จะมุ่งมั่นพัฒนา Software ให้เสร็จตามเวลาที่กำหนด จนบางทีก็ละเลยแบบตั้งใจและไม่ได้ตั้งใจ ที่จะทำให้ Source Code ที่เขียน มีคุณภาพหรืออย่างน้อยก็ได้ตามมาตรฐานที่มันควรจะเป็น</p>
<p>เรื่องเหล่านี้บางคนอาจไม่ค่อยอินเท่าไร หากทำงานคนเดียว หรืองานที่เร่งด่วนมากๆ (&#8220;งานร้อน&#8221; นั่นหละ) โดยเฉพาะงานทำครั้งเดียวเสร็จ ส่ง รับเงิน แล้วก็แยกย้าย.. แต่กับอีกหลายคนที่ต้องทำงานเป็นทีม หรือมี QA , CTO, Team Lead คอยเข้ามาตรวจสอบการทำงานของ Software และ Review Code อยู่สม่ำเสมอ ก็คงต้องปวดหัวกลับมาแก้งานรายชั่วโมง จนไม่ต้องทำมาหากิน</p>
<p>วันนี้เลยเอาเครื่องมือว้าวๆ ตัวหนึ่งชื่อ SonarQube มาให้ลอง มันเป็นตัวที่ช่วยตรวจสอบคุณภาพของ Source Code ให้เราได้แบบอัตโนมัติ <span id="more-4139"></span></p>
<h2>ความสามารถของ SonarQube หลักๆ มีดังนี้</h2>
<ul>
<li>ตรวจหาข้อผิดพลาด (Bugs) ใน Source Code</li>
<li>ช่วยค้นหาพวก Source Code ที่แย่ๆ ซับซ้อน มีกลิ่นตุๆว่าจะเป็นปัญหาในอนาคต (Code Smells)</li>
<li>ช่วยค้นหาช่องโหว่ต่างๆ ที่เป็นข้อผิดพลาดหรือปัญหาด้านความปลอดภัย (Vulnerabilities)</li>
<li>กำหนดค่าของคุณภาพที่จะให้ผ่านได้ด้วยนะ (Quality Gate) เช่น ต้องมี Code Coverage 80%</li>
<li>ทำงานร่วมกับ Automation Tools เช่น <a href="https://myifew.com/4027/how-to-setup-jenkins-automation-tools/">Jenkins</a> เพื่อทำ <a href="https://myifew.com/4039/automation-testing-by-phpunit-and-jenkins/">Continueus Integration</a> ได้ (Continuous Code Quality)</li>
<li>รองรับการตรวจสอบภาษาฮิตๆ ได้มากกว่า 20 ภาษา เช่น Java, PHP, C#, Python, Swift, C/C++, Javascript ฯลฯ</li>
<li>ทั้งหมดนี้&#8230; ฟรี!! (Open Source)</li>
</ul>
<p>แค่อ่านความสามารถจบก็ โครต &#8220;ว้าว!!&#8221; ตามที่บอกเลยปะล่ะ</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4154" src="https://myifew.com/wp-content/uploads/2017/08/Projects-1200x552.png" alt="" width="1024" height="471" srcset="https://myifew.com/wp-content/uploads/2017/08/Projects-1200x552.png 1200w, https://myifew.com/wp-content/uploads/2017/08/Projects-600x276.png 600w, https://myifew.com/wp-content/uploads/2017/08/Projects-1024x471.png 1024w, https://myifew.com/wp-content/uploads/2017/08/Projects-768x354.png 768w, https://myifew.com/wp-content/uploads/2017/08/Projects-700x322.png 700w, https://myifew.com/wp-content/uploads/2017/08/Projects.png 1349w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<h2>ลองติดตั้ง SonarQube Server กัน</h2>
<p>ถ้าใครใช้ Docker ก็ติดตั้งไม่ยาก จะใช้ sonarqube ที่ <a href="https://hub.docker.com/_/sonarqube/">hub.docker</a> หรือ <a href="https://github.com/ifew/sonarqube">git</a> ของผมก็ได้ (เอา official มาปรับนิดหน่อย ใส่ extension + ทำเป็น docker-compose)</p>
<p>ถ้าใช้ official ก็ทำคำสั่งง่ายๆเลย คือ</p>
<p>[wc_code]$ docker run -d &#8211;name sonarqube -p 9000:9000 -p 9092:9092 sonarqube[/wc_code]</p>
<p>แต่ถ้าไม่ได้ใช้ Docker ก็ไปหาติดตั้งได้ที่นี่ครับ <a href="https://www.sonarqube.org/downloads/">https://www.sonarqube.org/downloads/</a></p>
<p>เวลาใช้งาน Server จะเข้าผ่าน URL</p>
<p>[wc_code]http://localhost:9000[/wc_code]</p>
<p>ติดตั้ง</p>
<h2>ติดตั้ง SonarQube Scanner</h2>
<p>หลังจากมี Server สำหรับเก็บรวบรวม Report แล้ว จะต้องมีตัว Scanner เพื่อทำการประมวลผล Source Code ของเราเพื่อส่งเข้าไปทำ Report ซึ่งตัวนี้เรียกว่า SonarQube Scanner</p>
<p>โดยตัวมาตรฐาน จะสามารถดาวโหลดได้ที่<br />
<a href="https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner">https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner</a></p>
<p>ที่ผมบอกว่าเป็นตัวมาตรฐาน เพราะมีภาษาบางภาษาจะต้องใช้ Scanner ที่ทำมารองรับภาษาของตัวเอง เช่น .Net Core จะต้องใช้ SonarQube Scanner for MSBuild เท่านั้น ถึงจะอ่าน Source Code ออก เป็นต้น ดังนั้น ลองดูความเหมาะสมของภาษาที่ตนเองใช้ และโหลดตามลิงค์ด้านล่างได้เลยครับ</p>
<ul>
<li><a href="https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+MSBuild">SonarQube Scanner for MSBuild</a>: Launch analysis of .Net projects</li>
<li><a href="https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Maven">SonarQube Scanner for Maven</a>: Launch analysis from Maven with minimal configuration</li>
<li><a href="https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Gradle">SonarQube Scanner for Gradle</a>: Launch Gradle analysis</li>
<li><a href="https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Ant">SonarQube Scanner for Ant</a>: Launch analysis from Ant</li>
<li><a href="https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins">SonarQube Scanner For Jenkins</a>: Launch analysis from Jenkins</li>
<li><a href="https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner">SonarQube Scanner</a>: Launch analysis from the command line when none of the other analyzers is appropriate</li>
</ul>
<h2>สร้างไฟล์ Sonar Config</h2>
<p>ในการสั่งให้ Scanner ทำงานอ่าน Source Code ใดๆ จะต้องสร้าง Config ไว้ในโฟลเดอร์ของ Source Code นั้นไว้ด้วย</p>
<p>โดยไฟล์ที่สร้างจะชื่อว่า &#8220;sonar-project.properties&#8221; และข้อมูลหลักๆที่ใส่คือ</p>
<blockquote><p># SonarQube server<br />
sonar.host.url=<span style="color: #0000ff;">http://localhost:9000</span></p>
<p># must be unique in a given SonarQube instance<br />
sonar.projectKey=<span style="color: #0000ff;">my:project</span></p>
<p># this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.<br />
sonar.projectName=<span style="color: #0000ff;">My project</span><br />
sonar.projectVersion=<span style="color: #0000ff;">1.0</span></p>
<p># Path is relative to the sonar-project.properties file. Replace &#8220;\&#8221; by &#8220;/&#8221; on Windows.<br />
# This property is optional if sonar.modules is set.<br />
sonar.sources=<span style="color: #0000ff;">.</span></p>
<p># Encoding of the source code. Default is default system encoding<br />
#sonar.sourceEncoding=<span style="color: #0000ff;">UTF-8</span></p></blockquote>
<p>เช่น ผมจะให้ Scan Source Code ของ PHP Project เพื่อทำ report ไว้บน Docker บนเครื่องผมเอง</p>
<div>
<blockquote>
<div>sonar.host.url=http://localhost:9000</div>
<div>sonar.projectKey=My-PHP-Project</div>
<div>sonar.projectName=My-PHP-Project</div>
<div>sonar.projectVersion=1.0</div>
<div>sonar.sourceEncoding=UTF-8</div>
<div>sonar.sources=./application/</div>
<div>sonar.language=php</div>
</blockquote>
<h2>สั่งให้ SonarQuber Scanner ทำงาน</h2>
<p>เมื่อเซ็ตทุกอย่างเรียบร้อย ก็เข้าไปที่โฟลเดอร์ Source Code ของเรา ที่มีไฟล์ sonar-project.properties เรียบร้อยแล้ว จากนั้นรันคำสั่ง</p>
<p>[wc_code]$ sonar-scanner[/wc_code]</p>
<p>จะขึ้นข้อความแสดงการทำงาน ก็รอมันทำจนเสร็จ และมีข้อความ Excution Success</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4153" src="https://myifew.com/wp-content/uploads/2017/08/2560-08-20-23_50_36-Administrator_-Windows-PowerShell.png" alt="" width="680" height="262" srcset="https://myifew.com/wp-content/uploads/2017/08/2560-08-20-23_50_36-Administrator_-Windows-PowerShell.png 680w, https://myifew.com/wp-content/uploads/2017/08/2560-08-20-23_50_36-Administrator_-Windows-PowerShell-600x231.png 600w" sizes="auto, (max-width: 680px) 100vw, 680px" /></p>
<p>จากนั้นเข้าไปที่ [wc_code]http://localhost:9000[/wc_code] มันก็จะแสดงข้อมูล Dashboard ทุกโปรเจ็คที่เราเคยสั่งให้มัน Scan ทั้งหมดมาให้</p></div>
<div></div>
<div><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4154" src="https://myifew.com/wp-content/uploads/2017/08/Projects-1200x552.png" alt="" width="1024" height="471" srcset="https://myifew.com/wp-content/uploads/2017/08/Projects-1200x552.png 1200w, https://myifew.com/wp-content/uploads/2017/08/Projects-600x276.png 600w, https://myifew.com/wp-content/uploads/2017/08/Projects-1024x471.png 1024w, https://myifew.com/wp-content/uploads/2017/08/Projects-768x354.png 768w, https://myifew.com/wp-content/uploads/2017/08/Projects-700x322.png 700w, https://myifew.com/wp-content/uploads/2017/08/Projects.png 1349w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></div>
<p>เมื่อกดเข้าไปดูรายละเอียดของ Project จะบอกเลยครับว่า มี Bug เท่าไร, Code Smell เท่าไร ฯลฯ</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4155" src="https://myifew.com/wp-content/uploads/2017/08/project-php-1200x769.png" alt="" width="1024" height="656" srcset="https://myifew.com/wp-content/uploads/2017/08/project-php-1200x769.png 1200w, https://myifew.com/wp-content/uploads/2017/08/project-php-600x385.png 600w, https://myifew.com/wp-content/uploads/2017/08/project-php-1024x657.png 1024w, https://myifew.com/wp-content/uploads/2017/08/project-php-768x492.png 768w, https://myifew.com/wp-content/uploads/2017/08/project-php-700x449.png 700w, https://myifew.com/wp-content/uploads/2017/08/project-php.png 1349w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>กดเข้าไปดูรายละเอียดลึกลงไปอีก ก็จะเห็นว่ามีปัญหาอะไรที่ไฟล์ไหน เพื่อให้เราแก้ไข (ซึ่งบางที ปัญหาหลายอย่างที่พบ ก็อาจไม่ได้ส่งผลให้ Software ทำงานผิดพลาด แต่แค่ไม่เป็นไปตามมาตรฐานนั่นเอง)</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4156" src="https://myifew.com/wp-content/uploads/2017/08/Issues-php-project-1200x509.png" alt="" width="1024" height="434" srcset="https://myifew.com/wp-content/uploads/2017/08/Issues-php-project-1200x509.png 1200w, https://myifew.com/wp-content/uploads/2017/08/Issues-php-project-600x254.png 600w, https://myifew.com/wp-content/uploads/2017/08/Issues-php-project-1024x434.png 1024w, https://myifew.com/wp-content/uploads/2017/08/Issues-php-project-768x326.png 768w, https://myifew.com/wp-content/uploads/2017/08/Issues-php-project-700x297.png 700w, https://myifew.com/wp-content/uploads/2017/08/Issues-php-project.png 1349w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<h2>สรุป</h2>
<p>ลองใช้ดูแล้ว สนุกมากครับ ช่วยเราหา Bug หาโค้ดที่ไม่ดีได้ อ่านไปก็แก้ไป จำไป ดีต่อการพัฒนาความรู้ตัวเอง แต่สิ่งที่ต้องระวังและที่ผมพบปัญหาคือ บางทีติดตั้ง Scanner สำหรับใช้ในภาษาต่างๆ พอใช้แล้วปรากฎว่า ได้เกรด A ทุกหัวข้อ ไม่มี Code Smell ไม่มีข้อผิดพลาดอะไรเลย ซึ่งก็อย่าไปเชื่อมันนะครับ ปัญหานี้เกิดจากมัน Analyst Code ไม่ได้ เลยทำให้ไม่เจอปัญหา แล้วไอ้เจ้า SonarQube ก็ดันไม่แจ้ง Error อะไรมาด้วยว่ามัน Analyst ไม่ได้ ซึ่งจุดนี้ต้องทดสอบ Code ให้มันแบบ Pass และ Fail คู่กัน ให้เห็นว่ามันทำงานได้จริงไหม</p>
<p>เมื่อใช้คล่องตัวแล้ว เอามันไป Integrate กับ Jenkin เพื่อทำ CI/CD ก็ได้นะครับ เช่น เมื่อ Test ผ่านหมดแล้ว ก็ให้ Analyst Code ต่อว่าผ่านมาตรฐานที่เรากำหนดไว้ร่วมกันหรือไม่ ถ้าผ่านค่อย Deploy ต่อไป เป็นต้น .. แค่คิดก็มันส์แล้ววว</p>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/4139/continuous-code-quality-with-sonarqube/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
