Wednesday, November 17, 2010

淺談測試

這篇是寫給自己懺悔的

     「人長久處於安逸的情況,就會慢慢的不求上進,對於自己的工作麻痺,許多錯誤的習慣就視而不見。」

     最近在處理客戶的一個小小需求,這個需求也不過是把一個日常例行的SSIS Job裡的Table備份多增加幾個而已,依照以前的經驗,當然是測試之後就拿給客戶正式上線了;可是,客戶這幾天反應,這個SSIS Job一直錯誤,從更新之後就沒有成功過。

     自己回去測,也沒有發現問題,看看所改的地方,也不至於出錯,那到底問題出在哪裡?抱著忐忑的心情跑去客戶的主機看看,客戶的主機端服務將近百人的業務,而提供的資料,是他們每日生財的資源,每天都有業績壓力的,當然不容許一點差錯,而在時間的壓力下,我做了一件蠢事,我竟然在running server上面跑了這個SSIS。

     由於這個SSIS的主要功能是備份資料,通常執行時間是晚上,避開白天正常業務的作業時間,所以這一執行下去就不得了,備份時,各table的locking,以及發生錯誤後,資料的rollback,造成了業務單位的資料庫死結,馬上電話就如飛雪般的過來;逼不得已,業務部門的經理只好請大家停止動作,以教育訓練的名義把大家叫離開電腦前,讓資料庫rollback成功後,慢慢的把死結消化掉。

     這個問題,後來還是要靠在正式環境上面執行,才能夠發現,所以,客戶就趁著離峰時間,把備份的資料減到最少,然後才看出來問題,原來是新增備份的幾個表格中,有一個Foreign Key到另外一個table,造成資料搬移後刪除時,出現了錯誤,測試環境裡面,剛好沒有相關的ForeignKey資料,以至於沒發現這個問題,更改了一下刪除順序之後,就可以正常執行了。

     這種正式與測試環境之間的差異所造成的測試盲點,已經不是第一次遇到,卻沒有好好的檢討改進作法,在此特別把心得記錄下來,以力求以後的改進:

1. 測試環境與正式環境的DB務求一致:
     兩邊的Table Schema需要一致之外,每次客戶給的schema還要再檢查一次,看看是否與正式環境相同,檢查項目至少有

(1). Primary Key
(2). Foreign Key
(3). Default Value
(4). Trigger
     其他比較細微的如
(5). DB Encoding
(6). Case Sensitive or Insensitive等等…

     最好找個有反向工程的軟體,把正式環境的實體關連圖畫出來,放在手邊隨時對照檢查。

2. 測試資料的完整性
     所有的測試成功與否,與使用者提供的測試資料品質有絕對的關連,所以在事前的測試資料整理就非常重要,可是,這方面也是客戶很難提供,因為各項資料,皆牽扯到保密以及業務考量,這點一定要跟客戶好好溝通,或是提供一個轉換資料的方法,把隱密資料mark起來,原則有

(1). 姓名欄位的遮蔽
(2). 身份證字號或其他重要的卡號的遮蔽
(3). 住址的遮蔽….

3. 使用者測試的方式:
     如果有可能的話,最好的方式是以平行測試的方式,讓使用者在正式與測試環境同時Key相同的資料,在一定的期間,驗證其修改的正確性,但是通常,真正Key資料的人是很懶得把相同的資料再次鍵入,所以提供自動轉換或輸入的方法也是不錯,步驟如下

(1). 平行測試
(2). 測試之後的驗證
(3). 保留舊有系統,提共緊急切換與系統支援之用
(4). 提供新舊資料轉換的功能

結論
     即便有充足的時間測試,程式還是會有錯誤,更不要說沒有測試急就章的上架了。執行者不管是客戶或是程式設計師,都應該多想一點,把使用者可能會操作的過程都模擬一遍,如此,才能夠盡量減少事後的彌補,以及專案的成敗。

Wednesday, October 08, 2008

支援多核心的縮圖程式(OpenMP)

先承認吧
這是我之前幫我朋友做的freeware
不過因為他網站還沒弄好
用這個程式的人也不多
所以也不知道要改什麼

最近剛接觸OpenMP
就把這個程式當做練習
看到自己多核心的電腦總算可以發揮100%的功效
心中的感動真是....

使用方法:

1.直接拖拉修改成寬度(drag & drop)
接將圖檔選取後拖拉至軟體icon上,再選擇寬度,程式會將所選取的圖檔修改成指定的大小,更名並另存到同個資料夾。

2.指定要修改的圖檔大小:
將程式開啟後出現選擇框,將同檔案夾內要修改的檔案都選起來後,在下方解析度的輸入框內,選擇圖檔要修改的寬度後,按開啟即將所選取的圖檔修改成指定的寬度大小,更名並另存到同個資料夾。
下載點1
下載點2

歡迎改進意見或是bug回報

Monday, September 22, 2008

OpenMP on VC6

OpenMP已經出來很久了
但是我發現它卻是最近的事情
就如同很多人還沒有發現自己的開發工具
其實是支援OpenMP的

[OpenMP Compilers]


如果您對OpenMP還很陌生的話
請參考

[簡易的程式平行化方法]


當然
在拜讀heresy大的文章之後
興致沖沖的趕快開啟VC 2005來試試看
看到雙CPU的電腦可以衝上100%是一種感動
總算沒有白花錢買電腦了
但是
自己之前的程式
都是投資在VC6上面
VC6沒有辦法直接用OpenMP是一大缺憾
但是卻有變通的方法
那就是使用VC6 + Intel Compiler

使用步驟如下
首先 去download 
[intel compiler Evaluate Version]


灌起來之後
打開VC6 
就會在menu->Tools 多出一個工具 [Intel(R) C++ compiler selection tools]
裡面會出現你所灌的compiler版本資訊



接下來就是重點了

打開你之前的VC6專案檔

在Project Settings裡



1. C/C++ ->Preprocessor Definitions 裡加上 _USE_INTEL_COMPILER




2. C/C++ -> Project Options 裡加上 /Qopenmp




3. 如果 Project Options是 "/MT",libguide.lib 會 statically linked,但是你用 "/MD" 的話,請在Link 的頁簽 加上 libguide.lib 不然程式會出現缺少libguide40.dll的錯誤訊息



程式的部份就要注意在有用到OpenMP的地方

加上 #include <omp.h>

當舊程式可以支援多CPU時

那種感動真是無法言語....

Tuesday, April 24, 2007

VB.net COM+ Tutorial part3

前面寫的
都是元件的部份
現在要講的
是如何使用元件的問題

以下是VB呼叫的範例
範例分為遠端使用跟本機呼叫

VS2005的元件使用上跟原本不太一樣
觀念上要先new一個實體
把實體傳給interface做參考
然後使用interface對元件進行操控
解釋起來有點困難
就把程式碼post出來
各位看一下就應該了解了
(註: 範例跟剛剛的元件沒有關係,完全是因為偷懶,剪現成的範例畫面)

1. 遠端呼叫時,參考tlb檔





















2. 遠端呼叫的方法










3. 本機呼叫的方法




VB.net COM+ Tutorial part2

再來要談註冊的問題
前面已經談過VS2005寫的元件不能夠用regsvr32來註冊
要用 regasm 來註冊
regasm在windows檔案夾裡
(跟剛剛System.EnterpriseServices.dll同一個目錄)
C:\WINNT(or windows)\Microsoft.NET\Framework\v2.0.50727

註冊指令就下
regasm ClassLibrary1.dll /tlb:ClassLibrary1.tlb /codebase
他會產生tlb檔
這個tlb檔很有用
當你把元件註冊在server上的[元件服務]時
client端就需要靠這個tlb檔來參考到這com+元件
這麼一來
就只需要在server端灌.net framework就好
不用每壹台client都灌.net framework

VB.net COM+ Tutorial part1

最近又偷懶沒有上來寫心得了
這次要談的是將class包裝成com元件
對於使用過VB的人應該都不是難事
因為VB寫的dll本身就是com元件

然而寫com元件在VS2005上有些不同
雖然VS2005已經簡化很多步驟
但還是有些地方要注意的
那就是VS2005寫出來的com是不能用以前的regsvr32來註冊
另外
對外界面要使用interface來export函式或是屬性
了解這兩點寫個com就不是難事
步驟還是用看圖說故事比較清楚

1. 開啟一個新的專案,專案型態選擇[類別庫]














2. 在選單[專案]上面,選擇[加入參考]
切換到[瀏覽]頁籤,在你的windows檔案夾裡面
尋找Microsoft.NET->Framework->v2.0.50727(看開發環境的版本)->System.EnterpriseServices.dll
將他引用進來



















3. 程式碼的部份,先import以下幾個參考
然後用interface將元件屬性及函式定義好
再寫個class Implements你的interface















4. 如果專案中還有其他class,記得將public class改成Friend Class






5. 專案屬性的部份,可以勾選[註冊com interop]
他會自動在本機上面註冊,對於開發時期比較便利































6. 建置專案,您的com元件就寫好了




























Wednesday, March 28, 2007

偷渡檔案到使用者的電腦裡

使用者如果不想用如InstallShield之類的安裝方法來發佈程式
但是,又想要在執行檔執行時,偷放一些檔案到安裝的電腦上
這時候,我們可以運用資源檔(Resource)
把想要偷渡的檔案包在執行檔裡面
同樣的
VS2005也大幅簡化了實做的方法
以下的例子,是偷渡一個spftp.exe到系統目錄的步驟
因為最近實在懶得打字
就抓圖片讓大家一個步驟一個步驟的看圖說故事

1.從專案中加入一個新的項目



















2.選擇資源檔













3.在資源檔的畫面中,加入現有的檔案











4.選擇spftp.exe


















5.將spftp.exe的屬性[建置動作]設為[內嵌資源]
























6.程式基本上先判斷spftp.exe是否存在system32資料夾裡,如果沒有的話,就塞進去













您也可以用同樣的方法
塞圖片或字串到資源檔裡
應用很廣,以後有空再介紹

Tuesday, March 20, 2007

關於ComboBox(Part2)

現在來談談看起來簡單,作起來困難的ComboBox技巧

Part2:
ComboBox選擇完成之後,要依照選擇的項目,修改ComboBox的文字
如下拉選單選[1.20070531 測試測試]
選完之後只顯現[測試測試]就好

Ans 2:
看來簡單的問題德瑞克卻搞好久
各位也許會說:
不就只需要在ComboBox的SelectedIndexChanged事件裡面
修改ComboBox的Text就好了嗎?

如果只是這樣的話
ComboBox的文字是一動也不會動的
德瑞克只好把腦筋動到Windows API上面

1.首先在Form上面加上參考
Imports System.Runtime.InteropServices
Imports System.Threading

2.將SetWindowText這個API加進來
Public Shared Sub SetWindowText(ByVal Handle As Integer, ByVal s As String)

3.在ComboBox的SelectedIndexChanged事件裡面開啟另外一個執行緒
去修改ComboBox的文字內容
在此要注意
我們須多加上
Control.CheckForIllegalCrossThreadCalls = False
讓UI可以被其他執行緒更改其值
不然會發生錯誤
執行緒的程式有些小複雜
我還是把整個程式Post出來
讓有興趣的人研究
如果您有更簡單的解決方法也請不吝告知

關於ComboBox(Part1)

User的需求總是沒有止境

而程式設計師的任務,就是在日新月異的技術中

服務User天馬行空的要求


最近苦命的德瑞克又遇到了幾個新的需求

而這些需求又正好都跟ComboBox有關

就順便介紹一下VS2005中ComboBox的一些新功能


下面這兩個需求

Part1 看來困難,作起來卻很簡單

Part2 看來簡單,作起來卻有點困難


Part1:ComboBox

需有自動完成功能

如使用者輸入[X]

下拉選單會出現與[X....]相關的選項


Ans 1:

在以前,不管是VB或是VC

要做到下拉選單的自動完成

是有一定的難度

但是VS2005中ComboBox的新功能

就包含自動完成了

只要將ComboBox屬性中

AutoCompleteMode設為Suggest

AutoCompleteSource設為ListItems

就可以達到自動完成的需求

當然上面那兩個選項還有其他很彈性的設定

在此就不多介紹

總之VS2005幫程式設計師省去了很多麻煩

令人驚嘆

Wednesday, March 07, 2007

DataGridView 怎麼 Click?

在使用DataGridView物件來呈現我們的資料時,最常需要撰寫它的Click()事件

通常,VB的使用者會在設計畫面上double Click,讓程式產生一個函式來撰寫Click事件的程式碼,可是.net預設產生的會是CellContentClick()事件,這個事件處理的是儲存格裡面的資料點選之後才會被觸發

如果我們以這個作為Click()事件時,程式執行後,會發現點選Grid時笨笨的,有時有觸發到,有時沒有。

其實,正確的作法應該是選取它的CellMouseClick()才對,這樣每次點選,該事件都能夠被觸發,用起來也不會笨笨的,同理,DoubleClick()也應該選取CellMouseDoubleClick。

Stored Procedure回傳值的接收方法

相信很多人會照著書上的方法,為了想要能夠從Stored Procedure中接收回傳值,將SqlCommand的CommandType設為StoredProcedure,然後一個一個的Parameter設定型態、值、傳入傳出方法,慢慢的一個一個參數設定下去

如果Stored Procedure的參數少的話還好,參數一多起來程式可是會搞死人,建議您使用比較方便的方法



直接將回傳的參數寫在Sql語法裡面,這樣一來,就可以省下command參數裡面許多煩人的設定了

Right不見了

在以前VB中,有一個不錯的字串函式Right(),現在.net把它包裝在Microsoft.VisualBasic這裡

其實可以發現到,微軟還是偏愛Visual Basic,以前Visual Basic所有的函式,在這個參考裡面都可找的到,而且,使用Visual Basic作開發專案時,[插入程式碼片段]也比使用C Sharp來的豐富

Mid切字會錯誤?

因為.net String預設以UTF8的格式來進行儲存與運算,所以,即使是中文字,它也只算作一個字在處理

這對於一些需要做切字,如上下行電文來說,將會非常的困擾,如果有中英夾雜的一個字串,想要正確的切出字串固定長度的資料,使用預設的String物件,將無法切得正確的資訊

以下,是一個可正確切得字串裡部分資料的函式,中文算成2個bytes