March 30, 2014

Git Extensions無法push程式碼至GitHub

Git Extensions無法將程式碼push至GitHub上,出現syntax error near unexpected token錯誤訊息


檢查路徑%USERPROFILE%\.gitconfig (以我本機來說路徑為C:\Users\Pete),發現git-credential-winstore.exe路徑有問題。將原本的!\\\"C:/Program Files (x86)/GitExtensions/GitCredentialWinStore/git-credential-winstore.exe\\\"改為!\"C:/Program Files (x86)/GitExtensions/GitCredentialWinStore/git-credential-winstore.exe\"後再重新push便不再出現相同問題。至於為何多出額外的反斜線,原因不明。


March 23, 2014

使用Selenium WebDriver進行網頁自動化測試

幾年前剛加入某個團隊時,因為對當時團隊所開發的系統還不熟悉,所以先被指派協助做UAT,順便了解一下系統中的主要功能,該系統是以ASP.NET Web Forms所開發。一開始還傻傻地照著測試案例文件做測試,在幾天之後開始覺得每次要手動做重覆的事情,雖然可以藉此了解一下系統功能,但似乎有點不太科學,也有點浪費時間,心想這種事應該是要自動化處理吧?

當時腦海先是閃過利用Sikuli來幫我開網頁點按鈕輸入資料做這些苦工,卻意外發現了Selenium IDE,讓我眼睛為之一亮。在接下來的幾天我就改用Selenium IDE錄製好測試案例,輕鬆地完成自動化UAT。然而Selenium IDE只支援FireFox,當時開發的系統主要還是以IE為主,所以又開始尋找可以以IE進行網頁自動化測試的方式。當時使用了WatiN,也成功地寫了些測試程式。

以上是題外話,目前的團隊相當重視測試,團隊成員不僅需要撰寫單元/整合測試,也需要知道如何撰寫Selenium測試,以便讓build server進行自動化測試,也因此發現原來Selenium也已經提供WebDriver機制讓.NET開發人員可以在VS裡針對不同的瀏覽器撰寫相同的測試程式。以下介紹如何使用Selenium WebDriver來進行網頁自動化測試,所使用的瀏覽器為Chrome。

首先建立兩個demo用的專案,一個為ASP.NET MVC 5專案SeleniumDemo,另一個為Class Library專案SeleniumDemo.Tests,並加入了Microsoft.VisualStudio.QualityTools.UnitTestFramework參考


在SeleniumDemo.Tests專案中透過NuGet指令Install-Package Selenium.WebDriver加入Selenium WebDriver參考。


http://chromedriver.storage.googleapis.com/index.html下載Chrome DriverChrome Driver為Selenium WebDriver啟動Chrome會使用到的執行檔(chromedriver.exe),並存放在tools資料夾裡。


確認ASP.NET MVC 5專案預設的網站可以正常執行後,我們要模擬使用者點選Register連結,看看使用者是否有被導向註冊頁面。

using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace SeleniumDemo.Tests
{
    [TestClass]
    public class AccountTests
    {
        [TestMethod]
        public void Can_Display_Register_Page()
        {
            string chromeDriverDirectory = string.Format(@"{0}\..\..\..\tools", Directory.GetCurrentDirectory());

            IWebDriver driver = new ChromeDriver(chromeDriverDirectory);
            driver.Navigate().GoToUrl("http://localhost:64872/");

            IWebElement registerLink = driver.FindElement(By.Id("registerLink"));

            registerLink.Click();

            Assert.AreEqual("http://localhost:64872/Account/Register", driver.Url);

            driver.Quit();
        }
    }
}

在以上程式碼中,我們設定了Chrome Driver(chromedriver.exe)的實體位置給WebDriver後,便透過WebDriver開啟瀏覽器導向網站首頁,找出Register連結並點選它,最後驗證導向後的網址是否為註冊頁面的網址,成功地話瀏覽器就會被關閉。這個測試案例很簡單,雖然有個小問題,例如測試失敗的話,瀏覽器就不會被關閉。但做為demo,我想這樣已經足夠。完整的範例專案可由https://github.com/petekcchen/blog/tree/master/SeleniumDemo下載。

March 16, 2014

HTTP Error 500.19 - Internal Server Error

協助同事佈署ASP.NET MVC 5至Windows Server 2008時出現以下錯誤。


詳細的錯誤訊息為The requested page cannot be accessed because the related configuration data for the page is invalid.。從訊息看起來應該是應用程式沒有足夠的權限可以讀取web.config檔案。依照以往的經驗,試著在應用程式所在的資料夾中加入IIS_IUSRSNETWORK SERVICE兩個使用者權限。重新瀏覽應用程式,還是得到相同的錯誤訊息。試著檢查web.config的內容也未發現不正確的區段或設定。

再檢查了一下應用程式資料夾裡的檔案,發現檔案名稱顯示為綠色,覺得有點好奇。

研究了一下發現有國外的網友遇到類似的問題。當檔名呈現為綠色時表示檔案被加密過,該網友將被加密過的圖檔放到網站上卻無法顯示出來。解決的方式便是將加密取消,在應用程式資料夾右鍵選取Properties


點選Advanced,將Encrypt contents to secure data取消勾選。



設定完成後可以看到應用程式資料夾內的檔案名稱恢復成黑色。重新執行ASP.NET MVC 5應用程式已可正常運作。


參考

Git Extensions中取得最新Remote Branch資訊

Git Extensions是一套可藉由GUI執行Git指令的工具,它也可以整合至Visual Studio中讓開發人員直接在VS內執行Git指令。



我將某個放在GitHub上的專案開了一個branch叫student-branch



試著在Git Extensions中透過GUI (GIT-> Checkout branch)取得student-branch並在本地端的repository建立相對應的branch,但卻看不到student-branch。


看來Git Extensions似乎不會在開啟下拉選單時即時更新Remote Branch資訊。要取得最新的Remote Branch資訊,可以command line方式(GIT-> Git bash)輸入Git指令git remote update取得更新。



若不想輸入Git指令,可以至GIT-> Manage remotes-> Default pull behavior (fetch & merge)中,點選Update all remote branch info取得更新。



可以看到,雖然透過了GUI,但骨子裡Git Extensions還是執行了git remote update指令來更新Remote Branch資訊。

March 9, 2014

SA1208 : CSharp.Ordering : System using directives must be placed before all other using directives.

專案上使用了StyleCop來對coding style做檢測,出現了以下警告


這個警告出現於在宣告using指示詞時,若.NET Framework內建using指示詞放在非內建using指示詞下方,StyleCop則會出現警告訊息。如下面範例的using NUnit.Framework放在using System上方。


通常我使用Visual Studio內建的工具來對using指示詞做清理加排序,如Remove and Sort


或是用CodeMaid執行Cleanup也可以順便將using指示詞做清理加排序。


之前在Visual Studio 2010使用以上兩個方式,我就能順利將using指示詞重新排序,內建的using指示詞便會移到上方去。但在Visual Studio 2013上,不管是使用內建的Remove and Sort或是使用CodeMaid,內建的using指示詞卻會被放在下方。比對了一下VS 2010和VS 2013的設定發現,在VS 2010中,Place 'System' directives first when sorting usings預設是勾選的。


而VS 2013中,這選項預設是未勾選的。


將此選項勾選後重新執行Remove and Sort或CodeMaid的Cleanup,可以看到內建的using指示詞便會排在上方了。