mysql 查询分析器中使用if_查询分析器中开发代码测试检查_MySQL
如果您像我一樣,則可能已經(jīng)花費(fèi)了很多時(shí)間在查詢分析器中開發(fā)代碼。在您對(duì)代碼感到滿意之后,可以立即對(duì)開發(fā)服務(wù)器上的測(cè)試數(shù)據(jù)庫運(yùn)行一個(gè)或兩個(gè)專設(shè) 測(cè)試。如果看起來沒有什么問題,您便可以將代碼投入生產(chǎn)。如果這是一段關(guān)鍵代碼,或者該代碼較為復(fù)雜,則您可能會(huì)執(zhí)行更多的檢查,以避免后驗(yàn)剖析。甚至在這種情況下,您也可能屏息以待。www.chinai tp 采集 ow er.comd1nHRZf
這就是我在大部分職業(yè)生涯中所采用的編碼方式。哦,有時(shí)我會(huì)存儲(chǔ)測(cè)試查詢以供將來使用,這通常是因?yàn)榭偛?CEO/CIO/部門經(jīng)理習(xí)慣于大約每周就改變一下他或她的要求。但是,除此以外,我不會(huì)再做什么。我通常在查詢分析器或它的 Oracle/Access/FoxPro 等效工具外部用專設(shè) 查詢進(jìn)行測(cè)試。更高強(qiáng)度的測(cè)試需要使用查詢分析器調(diào)試器。在絕望的情形下,需要使用 PRINT 語句。www.chinai tp 采集 ow er.comd1nHRZf
目前存在 一種更好的方式。www.chinai tp 采集 ow er.comd1nHRZf
超越專設(shè) 測(cè)試www.chinai tp 采集 ow er.comd1nHRZf
當(dāng)我的 SIL 部門采用極限編程 (XP) 時(shí),我們還采用了該方法論的單元測(cè)試部分,而它們兩者都使我成為更出色的開發(fā)人員。但是,即使您不在 XP 環(huán)境中工作,您仍然可以從 XP 風(fēng)格的單元測(cè)試中獲益。 www.chinai tp 采集 ow er.comd1nHRZf
單元測(cè)試不同于接受測(cè)試。單元測(cè)試用于測(cè)試較小的代碼塊(例如,存儲(chǔ)過程),而接受測(cè)試更多地涉及到用戶是否可以接受 UI。以下是我發(fā)現(xiàn)的單元測(cè)試的五個(gè)優(yōu)點(diǎn):www.chinai tp 采集 ow er.comd1nHRZf
? 它們能夠找出應(yīng)該承擔(dān)責(zé)任的當(dāng)事人。您是否收到過電子郵件,告訴您應(yīng)該修復(fù)程序錯(cuò)誤,而這實(shí)際上是其他某個(gè)人所作更改的副作用?好,如果您具有一些零散的測(cè)試查詢,請(qǐng)將它們包裝到可以定期運(yùn)行(或許是在晚上)的存儲(chǔ)過程中。請(qǐng)確保在單元測(cè)試失敗時(shí)能夠生成電子郵件。 www.chinai tp 采集 ow er.comd1nHRZf
? ;生成庫不需要花費(fèi)很長時(shí)間。每個(gè)存儲(chǔ)過程和每個(gè)存儲(chǔ)函數(shù)都應(yīng)當(dāng)具有為它編寫的測(cè)試,而觸發(fā)器也應(yīng)該如此。如果這聽起來有些苛刻,那么請(qǐng)想一想,能夠在問題到達(dá)生產(chǎn)服務(wù)器之前捕捉到它,從而拯救您自己,將會(huì)是一種多么好的感覺。如果您具有大量舊式代碼,那么為每個(gè)單元編寫測(cè)試可能需要多年的工作,并且您也不能僅僅為了編寫測(cè)試而停止新的開發(fā)工作。但是,您可以為每段新代碼編寫測(cè)試,也可以為您修改的每個(gè)過程編寫測(cè)試。用不了多長時(shí)間,您就會(huì)為關(guān)鍵的舊式代碼和新代碼編寫眾多的測(cè)試。 www.chinai tp 采集 ow er.comd1nHRZf
? 輕松創(chuàng)建準(zhǔn)確的代碼文檔。每個(gè)過程或函數(shù)都應(yīng)當(dāng)用不同的參數(shù)組合調(diào)用。這不僅能夠確保代碼按預(yù)期方式工作,而且還提供了有關(guān)您的工作的最新而準(zhǔn)確的文檔。另外一個(gè)編碼員只需查看您的測(cè)試,就可以了解對(duì)您的過程進(jìn)行調(diào)用的示例。誰知道呢?某一天,這另一個(gè)編碼員可能就是您自己。 www.chinai tp 采集 ow er.comd1nHRZf
? 它們迫使您預(yù)先進(jìn)行一點(diǎn)兒思考和計(jì)劃。您應(yīng)當(dāng)在編寫實(shí)際的過程或函數(shù)之前編寫自己的單元測(cè)試。“什么?”您說,“我抗議!我們?nèi)绾螢樯形催M(jìn)行編碼的東西編寫測(cè)試?” www.chinai tp 采集 ow er.comd1nHRZf
? 有一個(gè)很老的笑話,它講的是:有一個(gè)經(jīng)理說:“我將弄清楚他們需要什么。其余的人開始編碼。”那么,編碼員在知道他們需要編寫什么之前是無法開始工作的,不是嗎?當(dāng)您首先編寫測(cè)試時(shí),您將被迫考慮在開始編寫該過程之前,您希望該過程完成什么工作。 www.chinai tp 采集 ow er.comd1nHRZf
? 它們確實(shí)可以節(jié)省您的時(shí)間。開發(fā)人員經(jīng)常抱怨,編寫測(cè)試需要花費(fèi)比編寫實(shí)際過程更多的時(shí)間。有時(shí)的確如此。但是請(qǐng)考慮以下情況:我最近接受了一項(xiàng)任務(wù),即,修改我曾經(jīng)遇到過的最難的存儲(chǔ)過程之一。它是舊式代碼,但是我仍然首先編寫了測(cè)試。它花費(fèi)了我?guī)滋斓臅r(shí)間才完成,部分原因在于對(duì)該過程所施加的要求。實(shí)踐證明,出于我剛才列出的所有原因,該測(cè)試非常重要,并且當(dāng)我必須重新編寫該過程以改善性能時(shí),它變得彌足珍貴。 www.chinai tp 采集 ow er.comd1nHRZf
? 單元測(cè)試顯示重新編寫的過程中存在大量錯(cuò)誤,而我能夠很快地找到每個(gè)錯(cuò)誤的根源,所花費(fèi)的時(shí)間只占不使用單元測(cè)試時(shí)的幾分之一。然后,當(dāng)我認(rèn)為已經(jīng)完成該任務(wù)時(shí),模糊測(cè)試失敗了。主循環(huán)中的變量之一存在缺陷。如果代碼以這種狀態(tài)發(fā)布到生產(chǎn)環(huán)境中,那么這將是一個(gè)難以捕獲的程序錯(cuò)誤。最終,我以比采用其他方式更快的速度完成了這項(xiàng)任務(wù)。 www.chinai tp 采集 ow er.comd1nHRZf
如何編寫 T-SQL 單元測(cè)試www.chinai tp 采集 ow er.comd1nHRZf
在我告訴您有關(guān) T-SQL 測(cè)試框架的內(nèi)容之前,首先需要提醒您注意兩個(gè)非常基本的原則:www.chinai tp 采集 ow er.comd1nHRZf
? 第一,您需要一個(gè)具有良好測(cè)試數(shù)據(jù)的數(shù)據(jù)庫。我用“良好數(shù)據(jù)”表示來自現(xiàn)實(shí)世界的真實(shí)數(shù)據(jù)。無論您是一個(gè)多么優(yōu)秀的程序員,都無法充分地為應(yīng)用程序仿造數(shù)據(jù)。即使要替換的舊式系統(tǒng)由紙張組成,也要找一位數(shù)據(jù)錄入員來在某些表中輸入數(shù)據(jù)。完成獲得真實(shí)數(shù)據(jù)所需的工作。[盡管如此,仍然存在測(cè)試數(shù)據(jù)生成器。請(qǐng)參見本期中我的提示“生成測(cè)試數(shù)據(jù)”— 編者]www.chinai tp 采集 ow er.comd1nHRZf
? 第二,不應(yīng)當(dāng)針對(duì)生產(chǎn)數(shù)據(jù)庫進(jìn)行開發(fā)。您應(yīng)當(dāng)具有一個(gè)開發(fā)或測(cè)試數(shù)據(jù)庫,以便滿足您自己的需要。過去,當(dāng)我在 Oracle 進(jìn)行開發(fā)時(shí),我曾經(jīng)花費(fèi)了一周的時(shí)間將開發(fā)數(shù)據(jù)庫放在一個(gè)陳舊的服務(wù)器上。SQL Server 開發(fā)人員沒有這樣的借口。 www.chinai tp 采集 ow er.comd1nHRZf
在為開發(fā)數(shù)據(jù)庫配備良好的數(shù)據(jù)以后,您需要某種框架以便運(yùn)行測(cè)試。您可以編寫自己的框架,但是為什么要這么做呢?已經(jīng)有一個(gè)可用的框架了。www.chinai tp 采集 ow er.comd1nHRZf
TSQLUnit 簡(jiǎn)介www.chinai tp 采集 ow er.comd1nHRZf
TSQLUnit 是 T-SQL 的一個(gè)開放源碼單元測(cè)試框架,它由 Henrik Ekelund 編寫,并且可以從 http://sourceforge.net/projects/tsqlunit 獲得。以下是一個(gè)有關(guān)我如何使用它的示例。www.chinai tp 采集 ow er.comd1nHRZf
我的 TSQLUnit 測(cè)試采用了類似的三部分模式:1) 單元測(cè)試設(shè)置,2) 執(zhí)行目標(biāo)過程,和 3) 檢查結(jié)果。www.chinai tp 采集 ow er.comd1nHRZf
在單元測(cè)試設(shè)置過程中,我經(jīng)常進(jìn)行檢查,以確保沒有人趁我不注意時(shí)破壞了我的數(shù)據(jù):www.chinai tp 采集 ow er.comd1nHRZf
DECLARE @nId INT, @nNewId INT a?”- @nNewId is for later
SELECT @nId = [ID] FROM MyTable
WHERE MyField = 'whatever'
IF @nId IS NULL -- or @@ROWCOUNT = 0
EXEC tsu_failure 'The data has changed.
'whatever' couldn't be found'
IF 塊用于檢查預(yù)期的記錄。如果找不到該記錄,則測(cè)試會(huì)失敗,并且會(huì)生成錯(cuò)誤信息。測(cè)試框架移動(dòng)至下一個(gè)單元測(cè)試。您不需要在失敗消息字符串中使用該單元測(cè)試的名稱,因?yàn)楫?dāng)測(cè)試失敗時(shí),TSQLUnit 將為您命名它。www.chinai tp 采集 ow er.comd1nHRZf
現(xiàn)在,我調(diào)用將要編寫的存儲(chǔ)過程:www.chinai tp 采集 ow er.comd1nHRZf
EXEC CreateMyTableNewRec @nId, @nNewId OUTPUT
正如您看到的那樣,我已經(jīng)確定了需要來自這一新過程的輸出參數(shù)。在檢查結(jié)果的過程中,我確保輸出參數(shù)確實(shí)填充了某些內(nèi)容:www.chinai tp 采集 ow er.comd1nHRZf
IF @nNewId IS NULL
EXEC tsu_failure
'A new record was not created for table MyTable.'
我可以進(jìn)一步檢查該值,以查看新記錄是否是按照我希望的方式創(chuàng)建的。www.chinai tp 采集 ow er.comd1nHRZf
每個(gè) TSQLUnit 測(cè)試本身都是一個(gè)存儲(chǔ)過程。清單 1 顯示了在將上述所有代碼段放在一起時(shí)所具有的樣子:www.chinai tp 采集 ow er.comd1nHRZf
清單 1. T-SQL 的完整單元測(cè)試。www.chinai tp 采集 ow er.comd1nHRZf
CREATE PROCEDURE ut_MyTable_NewRec
AS
--== Setup ==--
DECLARE @nID INT, @nNewId INT
SELECT @nId = ID FROM MyTable
WHERE MyField = 'whatever'
IF @nId IS NULL -- or @@ROWCOUNT = 0
EXEC tsu_failure 'The data has changed.
'Whatever' couldn't be found'
--== Execute ==--
EXEC CreateMyTableNewRec @nId, @nNewId OUTPUT
本條技術(shù)文章來源于互聯(lián)網(wǎng),如果無意侵犯您的權(quán)益請(qǐng)點(diǎn)擊此處反饋版權(quán)投訴
本文系統(tǒng)來源:php中文網(wǎng)
TAG標(biāo)簽:測(cè)試查詢開發(fā)
總結(jié)
以上是生活随笔為你收集整理的mysql 查询分析器中使用if_查询分析器中开发代码测试检查_MySQL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蕾哈娜亮相!Apple Music超级碗
- 下一篇: centeros6.8 mysql_ce