星期二, 10月 21, 2008

某些測試在特定機器上老是出現假警報怎麼辦

在指定機器上關掉該假警報測試

[Test]
public void Test(){

if (Environment.MachineName.ToUpper() == "BAD MACHINE")
    Assert.Ignore("this test caused false alarms on BAD MACHINE");

}

星期三, 4月 16, 2008

限制TRAC report中出現的ticket的時間

changetime - strftime('%s','2008-04-01 02:34:56')

星期五, 4月 11, 2008

使用Microsoft Virtual PC 2007 來輔助測試安裝檔

準備工作

  1. 使用MS Virtual PC安裝一個乾淨的Windows XP
  2. Install Virtual Machine Additions
  3. 在設定中開啟"Enable Undo Disks"。(為了還原硬碟狀態)
  4. 在設定中指定一個Shared Folder。 (為了複製程式到Virtual Machine中)
  5. 複製一些需要的安裝工具到Shared Folder,安裝這些工具到Virtual Machine中。
  6. 確認一切無誤後,關閉virtual machine,選擇"Turn Off and Save Changes"。記得勾選"Commit Changes to the Virtual Hard Disk"。

測試安裝檔

  1. 包裝安裝檔
  2. 開啟virtual machine。
  3. 複製安裝檔在Virtual Machine用的Shared Folder。
  4. 安裝安裝檔
  5. 要關閉Virtual Machine重新測試時,請選擇"Turn Off and Delete Changes"。表示要關掉virtual machine,但不要將硬碟的改變存回去。

注意:

  • Virtual PC能夠undo的只有硬碟的狀態,也就是所謂的"changes"
  • 至於"state"則只能凍結目前CPU, Ram的狀態,下次重開virtual machine時,會回到上次凍結的狀態。"state"目前測試的結果是不能undo的。

星期六, 3月 22, 2008

Nunit中避免category寫錯的小技巧

一般category的使用方式如下:

[Test, Category("IntegrationTest")]
void Test1(){.....}

----------------

一個避免寫錯與免記憶負擔的技巧:

建立一個namespace,內含一些class,用來表示所有測試的category:

namespace TestCategory
{
    class UnitTest : CategoryAttribute { }

    class IntegrationTest : CategoryAttribute { }
}

使用方式:

[Test, TestCategory.IntegrationTest]
void Test1(){.....}

星期六, 3月 01, 2008

vim簡易使用說明

  • 插入:i
  • 附加:a
  • 左右:hl
  • 上下:kj
  • 複製游標所在行:yy
  • 還原:u
  • 貼上:p
  • 不儲存直接離開::q!
  • 刪除游標所在字元:x
  • 刪除游標所在文字,然後進入插入模式:ciw

星期四, 2月 28, 2008

設定CruiseControl.NET產生統計報表

CruiseControl預設不會產生專案統計報表。

欲獲得統計報表,最簡單的設定方式是在ccnet.config中,在欲產生報表的project的<publishers>區段加入<statistics/>。如下所示:

<publishers>
    <xmllogger/>
    <statistics/>
</publishers>

專案執行成功後,可以在幾個地方看到統計資料報表:

  1. Dashboard的"View Statistics"網頁
  2. log目錄中的report.xml檔案
  3. log目錄中的statistics.csv檔案

要客製化報表內容可以使用如下的設定方式:

<statistics>
    <statisticList>
        <statistic name="TestCount" xpath="count(//MyTests/Test)"/>
        <statistic name="TestFailures" xpath="count(//MyTests/Test[@success='False'])"/>
        <statistic name="TestIgnored" xpath="count(//MyTests/Test[@success='Ignore'])"/>
    </statisticList>
</statistics>

此範例自訂了三個statistics:TestCount, TestFailures, 以及TestIgnored。利用xpath來指定所要產生的數值。

若專案有使用nunit,只要<statistics/>有設定,就會自行產出上述三個statistics,無須使用客製化方式來設定。

星期二, 2月 26, 2008

使用命令列指令指定測試的Nunit類別

測試程式:

[TestFixture]
public class Class1
{
    [Test, Category("c1")]
    public void test1()
    {
        Console.WriteLine("test1");
    }

    [Test, Category("c2")]
    public void test2()
    {
        Console.WriteLine("test2");
    }

    [Test]
    public void test3()
    {
        Console.WriteLine("test3");
    }

}

 

指令與結果:

C:\Program Files\NUnit 2.4.3\bin>nunit-console.exe c:\temp\cl2\bin\Debug\cl2.dll -include=c1

Included categories: c1
.test1

Tests run: 1, Failures: 0, Not run: 0, Time: 0.078 seconds


C:\Program Files\NUnit 2.4.3\bin>nunit-console.exe c:\temp\cl2\bin\Debug\cl2.dll -include=c1,c2

Included categories: c1,c2
.test1
.test2

Tests run: 2, Failures: 0, Not run: 0, Time: 0.094 seconds

 

C:\Program Files\NUnit 2.4.3\bin>nunit-console.exe c:\temp\cl2\bin\Debug\cl2.dll  -exclude=c1

Excluded categories: c1
.test2
.test3

Tests run: 2, Failures: 0, Not run: 0, Time: 0.078 seconds

星期日, 2月 24, 2008

從命令列執行visual studio編譯功能

devenv "MySolution.sln" /build Release /project MyProject /projectconfig Release

 

上述用法主要用於編譯C++專案,若要編譯C#或VB.NET專案,可以使用msbuild

星期二, 2月 19, 2008

在TRAC報告中顯示更新時間

SELECT p.value AS __color__,
   id AS ticket, summary, version, milestone, t.type AS type,
   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner,
   Datetime(Datetime(changetime,'unixepoch'), 'localtime') as changed,
   time AS created,
   changetime AS _changetime, description AS _description,
   reporter AS _reporter
  FROM ticket t, enum p
  WHERE status IN ('new', 'assigned', 'reopened')
AND p.name = t.priority AND p.type = 'priority'
  ORDER BY changetime desc

 

changetime原先的內容為Julianday,轉成可閱讀的unix時間格格式後,再轉換成localtime。

星期六, 2月 02, 2008

在Dashboard主頁上顯示客製化報告

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html"/>

  <xsl:variable name="report.list" select="//我的測試報告"/>

  <xsl:template match="/">

    <!-- 有內容才顯示報告 -->
    <xsl:if test="count($report.list)>0">
      <table class="section-table" cellpadding="2" cellspacing="0" border="0" width="98%">
        <tr>
          <!-- 根據實際欄位個數調整colspan -->
          <td class="sectionheader" colspan="5">
            我的測試報告: 共有<xsl:value-of select="count($report.list)"/>份報告
          </td>
        </tr>
        <tr>
          <xsl:if test="position() mod 2=0">
            <xsl:attribute name="class">section-oddrow</xsl:attribute>
          </xsl:if>
          <xsl:if test="position() mod 2!=0">
            <xsl:attribute name="class">section-evenrow</xsl:attribute>
          </xsl:if>

          <td>欄位1標題</td>
          <td>欄位2標題</td>
          <td>欄位3標題</td>
          <td>欄位4標題</td>
          <td>欄位5標題</td>
        </tr>
        <xsl:apply-templates select="$report.list"/>

      </table>
    </xsl:if>
  </xsl:template>

  <!-- 開始格式化報告內容 -->
  <xsl:template match="報告">

    <tr>
      <!-- 美化 -->
      <xsl:if test="position() mod 2=0">
        <xsl:attribute name="class">section-oddrow</xsl:attribute>
      </xsl:if>
      <xsl:if test="position() mod 2!=0">
        <xsl:attribute name="class">section-evenrow</xsl:attribute>
      </xsl:if>

      <!-- 資料 -->
      <td class="section-data" valign="top">
        <xsl:value-of select="欄位1資料"/>
      </td>
      <td class="section-data" valign="top">
        <xsl:value-of select="欄位2資料"/>
      </td>
      <td class="section-data" valign="top">
        <xsl:value-of select="欄位3資料"/>
      </td>
      <td class="section-data" valign="top">
        <xsl:value-of select="欄位4資料"/>
      </td>
      <td class="section-data" valign="top">
        <xsl:value-of select="欄位5資料"/>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

星期五, 1月 18, 2008

CruiseControl Dashboard顯示UnitTest++測試結果

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <xsl:apply-templates select="//unittest-results"/>
</xsl:template>

<xsl:template match="unittest-results">
    <html>
    <body>
      <h3>
        UnitTest++測試了<xsl:value-of select="@tests"/>筆資料,<xsl:value-of select="@failedtests"/>筆失敗,費時<xsl:value-of select="@time"/>秒
      </h3>
      <table>
        <tr>
          <th>Suite</th>
          <th>測試</th>
          <th>費時</th>
          <th>訊息</th>
        </tr>
      <xsl:for-each select="test">
        <xsl:if test="count(failure)>0">
          <tr bgcolor="#ffaaaa">
            <td>
              <xsl:value-of select="@suite"/>
            </td>
            <td>
              <font color="green">
                <xsl:value-of select="@name"/>
              </font>
            </td>
            <td>
              <xsl:value-of select="@time"/>
            </td>
            <td>
              <xsl:value-of select="failure/@message"/>
            </td>
          </tr>
        </xsl:if>
        <xsl:if test="count(failure)=0">
          <tr>
            <td>
              <xsl:value-of select="@suite"/>
            </td>
            <td>
              <font color="green">
                <xsl:value-of select="@name"/>
              </font>
            </td>
            <td>
              <xsl:value-of select="@time"/>
            </td>
            <td></td>
          </tr>
        </xsl:if>

      </xsl:for-each>
      </table>
    </body>
    </html>
</xsl:template>

</xsl:stylesheet>

星期二, 1月 15, 2008

追蹤subversion comment訊息錯誤

使用subversion相關的client工具時,如果發現comment內容有問題,想要追蹤時,可以直接到svn server上察看「repository目錄/db/revprops」,內含所有revision的comment。

星期五, 1月 11, 2008

TRAC顯示某里程碑中ticket進度

SELECT
owner AS __group__,
(CASE status WHEN 'closed' THEN 'color: #aaaaaa'
ELSE ''
END) AS __style__,
(CASE status WHEN 'assigned' THEN 4
ELSE 3
END) AS __color__,
id AS ticket,

(CASE status = 'closed'
WHEN 0 THEN
(CASE (round(julianday(substr(tc.value,7,4) ||
'-' || substr(tc.value,1,2) || '-' ||
substr(tc.value,4,2))) - round(julianday('now'))) < 0
WHEN 0 THEN (round(julianday(substr(tc.value,7,4) || '-' ||
substr(tc.value,1,2) || '-' || substr(tc.value,4,2)))
- round(julianday('now')))
ELSE '超時' || abs((round(julianday(substr(tc.value,7,4) || '-' ||
substr(tc.value,1,2) || '-' || substr(tc.value,4,2)))
- round(julianday('now')))) || '天'
END)
ELSE ''
END) AS '距截止天數',

tc.value AS '預估截止日',

status,
priority,
summary,
t.type AS type,
time AS created,
changetime AS _changetime,
description AS _description,
reporter AS _reporter,
tc2.value AS '_due assign',

date('now') as _nowdate,
julianday('now') AS _nowdate2

FROM ticket t,enum p, ticket_custom tc, ticket_custom tc2
where
t.id = tc.ticket AND
tc.name = "due_close" AND
t.id = tc2.ticket AND
tc2.name = "due_assign" AND
p.name=t.priority AND
p.type='priority' AND
t.milestone='**指定里程碑**'
ORDER BY owner, (status = 'closed') ,p.value, t.type, time

星期三, 1月 09, 2008

TRAC依使用者顯示所指定里程碑的工作狀況

以下指令可用在TRAC上建立一個「依使用者顯示所指定里程碑的工作狀況」的報告。
  • 依使用者分群
  • 依priority排序
  • 已經closed的ticket會排到最後面,同時以灰色字顯示
  • 已經assigned的以藍色底顯示

SELECT
owner AS __group__,
(CASE status WHEN 'closed' THEN 'color: #aaaaaa'
ELSE ''
END) AS __style__,
(CASE status WHEN 'assigned' THEN 4
ELSE 3
END) AS __color__,
id AS ticket,
status,
priority,
summary,
component,
t.type AS type,
time AS created,
changetime AS _changetime,
description AS _description,
reporter AS _reporter
FROM ticket t,enum p
where
p.name=t.priority AND
p.type='priority' AND
t.milestone='***里程碑***'
ORDER BY owner, (status = 'closed') ,p.value, t.type, time

sqlite使用筆記

  • database檔案: *.db
  • 連接db: sqlite3 foo.db
  • 區分sqlite指令與SQL指令
    • sqlite指令以「.」開頭,比如說「.tables」用來列出所有table。「.help」用來列出可用的sqlite指令。
    • SQL指令按照一般方式直接下,以「;」結尾。