[綜合]無題 無名 ID:d9HXfUGc 2019/08/15(四) 00:11:09.591 No.15661953
評分:0, 年:0, 月:0, 週:0, 日:0, [+1 / -1] 最後更新:2019-08-14 17:10:35
資深工程師島民救我QQ
最近開始學單元測試
但我遇到一個問題
就是邏輯寫在SQL的功能需不需要單元測試?
例如這是一個檢查今天有沒有射精的方法,有的話return true
[aa]
public bool IsCumToday()
{
return db.SingleOrDefault("SELECT * FROM 射精 WHERE DATE = '20190815'") != null;
}
[/aa]
以這個function來說,我要如何撰寫單元測試?
還是根本不用寫? (因為邏輯在SQL語法而非程式碼中)
感謝島民QQ
無題 無名 ID:d9HXfUGc 2019/08/15(四) 00:15:45.986 No.15662003
救我QQ
無題 無名 ID:GNutqV12 2019/08/15(四) 00:18:11.947 No.15662034
無題 無名 ID:d9HXfUGc 2019/08/15(四) 00:26:02.786 No.15662104 >>15662022感謝回覆
所以我是要建立一個假DB(一般而言是是localDB),把該function中的db替換掉,而這個假DB中分別塞進一筆今天有射精的記錄及沒射精的記錄,來驗證這個function在沒SELECT到時會正確地return true or false對吧,不知道我這樣理解有沒有誤?
此外,由於要替換db,我如果把function改成
[aa]
public bool IsCumToday(DataBase db)
{
return db.SingleOrDefault("SELECT * FROM 射精 WHERE DATE = '20190815'") != null;
}
[/aa]
增加參數這種寫法是不是不太好?
我應該在這個class把這個DB寫成介面以供替換嗎?
謝謝
無題 無名 ID:PqkhVQmk 2019/08/15(四) 00:40:56.962 No.15662227
無題 無名 ID:WWhV4Tc. 2019/08/15(四) 01:07:11.455 No.15662409 >>15662104這個 db 不一定要是資料庫
要 mock db 這個物件只要讓
db.SingleOrDefault("SELECT * FROM 射精 WHERE DATE = '20190815'")
有你預想的回傳值就好
所以你可能有一個 MockDatabase class
它有一個 method SingleOrDefault
輸入如果是 "SELECT * FROM 射精 WHERE DATE = '20190815'"
就回傳 true 之類的
測試時讓 MockDatabase 替換掉原本的 Database
當然直接寫 SQL query 不太好
無題 無名 ID:HjNrS7HM 2019/08/15(四) 01:11:22.358 No.15662434
無題 無名 ID:F5u/de.k 2019/08/15(四) 01:13:38.642 No.15662453
除非你要測試的是 stored procedure 裡面的行為
不然你只要測試 return true or false 之後的行為有確實達到即可
無題 無名 ID:Surt5xSc 2019/08/15(四) 01:15:51.380 No.15662464
無題 無名 ID:GNutqV12 2019/08/15(四) 01:38:13.255 No.15662609 >>15662104Function 也可以不用參數,因為可能會其他(大量的)code,如果 db 是 IsCumToday 所在 class 的成員變數的話,可以從建購子替換
無題 無名 ID:Dn2Ofh4c 2019/08/15(四) 01:42:30.795 No.15662635 >>15662317他這個看起來應該是JAVA,不是JS之類在前端跑的東西
而且也沒做字串運算
那應該是不會出什麼大問題
當然
如果寫的人不知道什麼條件下不會出問題
那即使這次OK了下次也可能爆掉
無題 無名 ID:d9HXfUGc 2019/08/15(四) 01:46:10.531 No.15662658 感謝各位回覆
>>15662409可是這種作法無法驗證我這段query的邏輯是不是正確的(因為沒有真的去撈DB),我還是會傾向弄一個假DB然後真的去撈假DB
>>15662623感覺從建構子指定確實是比較適合的,我應該會用這個方法,感謝
無題 無名 ID:RAXG7Skw 2019/08/15(四) 01:46:39.183 No.15662662 >IsCumToday()
>SELECT * FROM 射精 WHERE DATE = '20190815'
到了明天你是不是就要把20190815改成20190816再recompile跟deploy一次?
就是因為有你這種的人
我的手機才會一天有好幾十個app要更新!
無題 無名 ID:d9HXfUGc 2019/08/15(四) 01:55:45.943 No.15662736 感謝各位島民熱心回覆 之後開發新功能我再試試看
謝謝
>>15662662...你是不是沒寫過單元測試= =
在Setup階段塞當天的假資料到假DB
然後在TearDown階段把假DB的資料刪除
如此一來能保證每次單元測試都是當天的資料
而且單元測試只要按一個按鈕就會把全部的function測完了
不需要發行跟部屬什麼的= =
無題 無名 ID:4.5tmt1E 2019/08/15(四) 01:56:22.679 No.15662741 無題 無名 ID:Dn2Ofh4c 2019/08/15(四) 01:59:18.515 No.15662752
>>15662662那他可能要改成類似這樣
[aa]
public bool IsCumToday(String date)
{
return db.SingleOrDefault("SELECT * FROM 射精 WHERE DATE = '" + date + "'") != null;
}
[/aa]
然後單元測試就有用了
因為他可以測測看像這樣的東西會出什麼問題
[aa]
IsCumToday("';DELETE * FROM 射精 WHERE DATE != '")
[/aa]
但如果他知道需要這樣測,當初就不會寫出這爛code了
無題 無名 ID:d9HXfUGc 2019/08/15(四) 02:01:14.396 No.15662763
>>15662741我也不知道= =
剛入行一年 前輩撈資料庫都是直接用Navite Query
我認為這樣要改邏輯也比較好改吧?
寫成stored procedure的話沒辦法直接看程式碼就知道這段是在撈什麼/有沒有撈錯
無題 無名 ID:d9HXfUGc 2019/08/15(四) 02:05:55.073 No.15662785 不對啊
你們不下SQL query要怎麼撈資料?
總不可能把全部資料都撈進記憶體裡再自己寫演算法來找吧= =
這樣不就比db慢超多...
我是寫C#
難道要我去用entity framework嗎= =
無題 無名 ID:RAXG7Skw 2019/08/15(四) 02:20:16.874 No.15662852 >>15662736function的名字叫做IsCumToday()
那你就要做到名字寫的東西 測當天啊
這樣子你不就每天都要重寫單元測試?
或者你改個名字叫做IsCumAt20190815()
那就可以接受
不然就要真的查詢當天的日期:
public bool IsCumToday()
{
string today = DateTime.Now.ToString("yyyyMMdd");
return db.SingleOrDefault("SELECT * FROM 射精 WHERE DATE = '"+ today +"'") != null;
}
無題 無名 ID:d9HXfUGc 2019/08/15(四) 02:34:37.471 No.15662911 >>15662852這樣寫會有SQL Injection的風險,要處理和解釋有點麻煩,我怕導致問題篇題所以就省去了取得今天時間這段(string today = DateTime.Now.ToString("yyyyMMdd");)
結果造成大家誤解,不好意思
如果真的有這支程式,會是類似這樣寫沒錯
先去睡了 感謝各位熱心回覆 祝各位好人有好報 晚安
無題 無名 ID:KrI.N/.U 2019/08/15(四) 02:38:27.592 No.15662924
無題 無名 ID:KrI.N/.U 2019/08/15(四) 02:41:46.196 No.15662938
>>15662911SQL Injection,這就很好笑了。
通常來說不建議直接專案內寫SQL絕對不是因為這個因素。
會出現SQL Injection只是代表你過時了,不中用了,趕快去了解安全寫法吧。
至於真正為何不推薦新人直接在專案中寫SQL,請去問團隊內最肝的資深工程師。
有些東西必須要讓當事者親自說明會比較有感覺;當然自己體驗一輪也可以。
無題 無名 ID:QjHV/BaM 2019/08/15(四) 02:52:23.636 No.15662977
你們寫的一堆東西我都沒聽過...
這樣還能當碼農嗎?
會不會進公司甚麼都要我會
然後就爆炸了
感覺胃痛...
無題 無名 ID:RAXG7Skw 2019/08/15(四) 03:10:17.167 No.15663016
>>15662911一般是如果用在SQL query的data是從user的input來的
才會有被SQL inject的風險
那個function由頭到尾都是你自己寫的話是你自己inject自己喔...
無題 無名 ID:0ZaaFvnE 2019/08/15(四) 03:19:43.775 No.15663045