thắc mắc Các bác viết unit test thế nào ạ.

  • Người tạo chủ đề Người tạo chủ đề TrungNgaoNgo
  • Ngày bắt đầu Ngày bắt đầu
Thế lý do vì sao phải retry? Mà cho dù đó là một case đặc biệt muốn test luôn thì setup test cho nó thôi.

Nói như anh bảo phải viết test cover luôn trg hợp app đang chạy mà bị mất kết nối internet ấy

via theNEXTvoz for iPhone

1 là anh ko biết thật, hoặc là anh giả vờ ngu

nếu là trường hợp 1 thì để tôi nói cho anh thủng, cái đó gọi là retry-on-error, là một non-functional requirement nằm trong phần error handling mà rất nhiều hệ thống yêu cầu phải có.

để làm gì? để đảm bảo rằng trong các trường hợp system reach high peak dẫn đến một service nào đó bên dưới chưa kịp handle -> trả về error thì tầng bên trên sẽ retry lại x lần để make sure là nó thực sự ko thể chạy tiếp trước khi trả lại lỗi về cho người dùng.

Cụ tỉ ở đây nếu như anh dùng Azure CosmosDB, nó sẽ có 1 cái term là RU (Request Unit), mỗi collection trong db anh có thể define một ngưỡng RU (càng cao càng tốn tiền, nhưng càng serve được nhiều request đọc/ghi đồng thời). Nếu như chạm ngưỡng RU đã đặt ra thì DB sẽ trả về lỗi 429 (link), nếu anh ngay lập tức trả lỗi này về cho người dùng họ sẽ không hiểu chuyện gì đang xảy ra với system, vì đôi khi việc chạm ngưỡng này chỉ trong vài giây, vì thế nên developer cần handle việc retry lại ít nhất 3 lần, mỗi lần cách nhau xxx ms

vậy anh nói tôi nghe thử, với trường hợp dùng cloud service như trên anh định setup test kiểu gì ?
chạy sang data center của Azure rút dây mạng à ?
 
1 là anh ko biết thật, hoặc là anh giả vờ ngu

nếu là trường hợp 1 thì để tôi nói cho anh thủng, cái đó gọi là retry-on-error, là một non-functional requirement nằm trong phần error handling mà rất nhiều hệ thống yêu cầu phải có.

để làm gì? để đảm bảo rằng trong các trường hợp system reach high peak dẫn đến một service nào đó bên dưới chưa kịp handle -> trả về error thì tầng bên trên sẽ retry lại x lần để make sure là nó thực sự ko thể chạy tiếp trước khi trả lại lỗi về cho người dùng.

Cụ tỉ ở đây nếu như anh dùng Azure CosmosDB, nó sẽ có 1 cái term là RU (Request Unit), mỗi collection trong db anh có thể define một ngưỡng RU (càng cao càng tốn tiền, nhưng càng serve được nhiều request đọc/ghi đồng thời). Nếu như chạm ngưỡng RU đã đặt ra thì DB sẽ trả về lỗi 429 (link), nếu anh ngay lập tức trả lỗi này về cho người dùng họ sẽ không hiểu chuyện gì đang xảy ra với system, vì đôi khi việc chạm ngưỡng này chỉ trong vài giây, vì thế nên developer cần handle việc retry lại ít nhất 3 lần, mỗi lần cách nhau xxx ms

vậy anh nói tôi nghe thử, với trường hợp dùng cloud service như trên anh định setup test kiểu gì ?
chạy sang data center của Azure rút dây mạng à ?

Thì mock azure cosmos db. Ơ linh hoạt cho từng case cụ thể thôi chứ. :feel_good:

via theNEXTvoz for iPhone
 
Khi cái mới mà a nói + a đã trải nghiệm qua nhiều lần + thấy đc điểm yếu của nó thì a mới “ngộ” ra được anh ạ.

Ko phải tự nhiên người ta phát triển từ procedure programming tới oop rồi giờ lại quay ra functional programming. Hay từ monolithic + 3 layers lại đẽ ra clean architecture, micro services..

Đôi khi anh cũng nên xuống giếng chơi để thấy dc con ếch ở dưới đó biết đâu lụm dc bí kiếp võ công.

Khuyên: a cũng nên mở đầu ra khi thấy tư tưởng khác, đi ngc lại những gì a dc học. Đó là lúc mà một cái gì mới hơn sắp dc sáng tạo ra đó.
EcV5PPL.gif


via theNEXTvoz for iPhone
anh đừng nói chuyện kiểu out-of-scope tôi cười :) với cả mấy cái thứ mà anh nói nó cũng chả liên quan mẹ gì cả :)
À riêng vụ thời gian thì tôi có thừa nhé. Tôi lo cho mấy a e dev thôi chứ tôi rảnh lên Voz cãi nhau giờ hành chính thì a hiểu tôi thừa thời gian rồi.
zFNuZTA.gif


via theNEXTvoz for iPhone
cái "không có thời gian" mà tôi nói ở đây nó không phải là nghĩa đen :) cái mà tôi nói ở đây là cái câu chuyên dùng để nguỵ biện cho mấy cha dev cùi bắp toàn lấy lý do "không có thời gian" để deliver 1 đống code bùi nhùi ấy :) mấy cha đấy thì dù có "có thời gian" thì cũng đ biết code sao cho sạch đẹp đâu mà :)
quay trở lại chủ đề chính. mục tiêu của viết unit test nó éo phải là "code chạy không có lỗi" hay "lên prod không có lỗi" như anh nói, mocking code không bao giờ có thể đảm bảo được vấn đề đấy cả, anh muốn đảm bảo được việc đấy đấy thì anh phải dùng các loại test khác. mục tiêu của nó là self-review (nếu anh viết ra 1 cái function mà lúc viết UT đúng cách (hoặc không thể viết được UT) anh cảm thấy nó như c** thì đấy là lúc anh cần phải xem lại đoạn code của mình vì chắc chắn nó đang có vấn đề), documented lại cái idea, logic của function đấy, và đảm bảo được việc re-implement lại cái function đấy (để improve performance chẳng hạn) không bị sót logic hoặc sai idea của cái func đấy -> tự tin hơn trong việc sửa code không phải của mình.
tôi thấy anh kiểu cũng kinh nghiệm lâu năm, cũng có những chính kiến của mình, cũng biết bảo vệ chính kiến của mình. nhưng anh kiểu bình thường toàn làm việc một mình hoặc làm việc với team nhỏ lẻ ý, nên những convention, design kiểu phục vụ việc teamwork (team lớn) hiệu quả, hoặc để để việc maitenance dễ thở hơn anh toàn xem nhẹ xong gào lên bảo thừa thãi không cần thiết, với cả cái gì gì "thực tế không giống sgk". trong khi ý tưởng của nó thì anh không hiểu rõ xong áp dụng sai context...
 
anh đừng nói chuyện kiểu out-of-scope tôi cười :) với cả mấy cái thứ mà anh nói nó cũng chả liên quan mẹ gì cả :)

cái "không có thời gian" mà tôi nói ở đây nó không phải là nghĩa đen :) cái mà tôi nói ở đây là cái câu chuyên dùng để nguỵ biện cho mấy cha dev cùi bắp toàn lấy lý do "không có thời gian" để deliver 1 đống code bùi nhùi ấy :) mấy cha đấy thì dù có "có thời gian" thì cũng đ biết code sao cho sạch đẹp đâu mà :)
quay trở lại chủ đề chính. mục tiêu của viết unit test nó éo phải là "code chạy không có lỗi" hay "lên prod không có lỗi" như anh nói, mocking code không bao giờ có thể đảm bảo được vấn đề đấy cả, anh muốn đảm bảo được việc đấy đấy thì anh phải dùng các loại test khác. mục tiêu của nó là self-review (nếu anh viết ra 1 cái function mà lúc viết UT đúng cách (hoặc không thể viết được UT) anh cảm thấy nó như c** thì đấy là lúc anh cần phải xem lại đoạn code của mình vì chắc chắn nó đang có vấn đề), documented lại cái idea, logic của function đấy, và đảm bảo được việc re-implement lại cái function đấy (để improve performance chẳng hạn) không bị sót logic hoặc sai idea của cái func đấy -> tự tin hơn trong việc sửa code không phải của mình.
tôi thấy anh kiểu cũng kinh nghiệm lâu năm, cũng có những chính kiến của mình, cũng biết bảo vệ chính kiến của mình. nhưng anh kiểu bình thường toàn làm việc một mình hoặc làm việc với team nhỏ lẻ ý, nên những convention, design kiểu phục vụ việc teamwork (team lớn) hiệu quả, hoặc để để việc maitenance dễ thở hơn anh toàn xem nhẹ xong gào lên bảo thừa thãi không cần thiết, với cả cái gì gì "thực tế không giống sgk". trong khi ý tưởng của nó thì anh không hiểu rõ xong áp dụng sai context...

Còn anh thì chỉ biết mổi cái vấn đề kỹ thuật thôi. Bởi vậy tôi mới nói các anh “thợ code” là đúng đấy.

Giờ tôi cho anh đề bài như này:

1. Code cũ, dependencies búa xua, not testable.
2. Team toàn fresher, junior đúng nghĩa có thời gian cũng éo biết code sao cho đẹp.
3. Trong vòng 1 tuần phải release features, fix các bug critical và đặc biệt ko dc phép fix bugs này tạo ra bug mới vì đã bị escalate nhiều lần, khách hàng yêu cầu test coverage 90%.
4. Dự án over budget, thêm 1 man day là thằng PM gào lên, head department gào lên nên KHÔNG muốn tốn thêm bất kỳ man days nào để refactor code hay delay nữa.
5. PM và Head gặp mặt thì hỏi 1 câu duy nhất: “Khi nào xong?” Éo quan tâm ba cái vấn đề code kiếc vớ vẩn.

Mới anh giải quyết. :feel_good:

Anh lên chém gió về UT của anh đơn giản là người ta đíu quan tâm và cái ng ta quan tâm là cuối tuần này release và khách hàng nó ko chửi nữa. Ok.

via theNEXTvoz for iPhone
 
Sửa lần cuối:
Còn anh thì chỉ biết mổi cái vấn đề kỹ thuật thôi. Bởi vậy tôi mới nói các anh “thợ code” là đúng đấy.

Giờ tôi cho anh đề bài như này:

1. Code cũ, dependencies búa xua, not testable.
2. Team toàn fresher, junior đúng nghĩa có thời gian cũng éo biết code sao cho đẹp.
3. Trong vòng 1 tuần phải release features, fix các bug critical và đặc biệt ko dc phép fix bugs này tạo ra bug mới vì đã bị escalate nhiều lần, khách hàng yêu cầu test coverage 90%.
4. Dự án over budget, thêm 1 man day là thằng PM gào lên, head department gào lên nên KHÔNG muốn tốn thêm bất kỳ man days nào để refactor code hay delay nữa.
5. PM và Head gặp mặt thì hỏi 1 câu duy nhất: “Khi nào xong?” Éo quan tâm ba cái vấn đề code kiếc vớ vẩn.

Mới anh giải quyết. :feel_good:

Anh lên chém gió về UT của anh đơn giản là người ta đíu quan tâm và cái ng ta quan tâm là cuối tuần này release và khách hàng nó ko chửi nữa. Ok.

via theNEXTvoz for iPhone
Ơ cái nhà anh này, đấy là chất lượng code anh các a như shit, est như shit, management cũng như shit nốt. Nó chẳng liên quan đến cái việc UN là thừa thãi như a nói cả. Ở đây mọi người chỉ nói về vấn để kỹ thuật, a lôi cái đấy vào làm gì? A ko làm dc, ko deal dc khách nên a lại bảo UN là thừa. Tôi chịu. Tôi cũng ko biết a role là gì mà a cứ mở mồm ra là chê người khác là thợ code. Nói thật, nếu anh là manager thì a cũng chỉ là thằng “thợ quản lý” với cái mindset nông dân của mình.
 
Ơ cái nhà anh này, đấy là chất lượng code anh các a như shit, est như shit, management cũng như shit nốt. Nó chẳng liên quan đến cái việc UN là thừa thãi như a nói cả. Ở đây mọi người chỉ nói về vấn để kỹ thuật, a lôi cái đấy vào làm gì? A ko làm dc, ko deal dc khách nên a lại bảo UN là thừa. Tôi chịu. Tôi cũng ko biết a role là gì mà a cứ mở mồm ra là chê người khác là thợ code. Nói thật, nếu anh là manager thì a cũng chỉ là thằng “thợ quản lý” với cái mindset nông dân của mình.

Mời anh đọc lại #103 và #114 của tôi. Hình như tôi chưa bao giờ nói UT là thừa cả.

Còn a bảo là chỉ dc bàn vấn đề kỹ thuật thì tôi lượn thôi vì mấy cái đó nó quá cơ bản, a hỏi 1 thằng sv hay đọc sách thì đều chém đc hết.

Khịa mấy a vài cái như “thợ code” hay “công nhân IT” là giãy nãy lên rồi.

A nên nhớ trong thế giới này ko phải Perfect World và tất cả mọi thứ đều phải đánh đổi. Một ng gọi là giỏi là người có thể đạt được mục tiêu trong các điều kiện giới hạn chứ ko phải điều kiện hoàn hảo.

Cái tình huống bên trên tôi đưa ra là một tình huống thực tế. Nếu anh ko phải là thợ code thì a phải giải quyết dc nó với các ràng buộc như vậy. Chứ ko phải là chỉ biết chửi team, chửi sếp, chửi dự án, chửi khách hàng rồi đập bàn nghỉ, bỏ chạy đi chổ khác thôi. :look_down:


via theNEXTvoz for iPhone
 
Sửa lần cuối:
Mời anh đọc lại #103 và #114 của tôi. Hình như tôi chưa bao giờ nói UT là thừa cả.

Còn a bảo là chỉ dc bàn vấn đề kỹ thuật thì tôi lượn thôi vì mấy cái đó nó quá cơ bản, a hỏi 1 thằng sv hay đọc sách thì đều chém đc hết.

Khịa mấy a vài cái như “thợ code” hay “công nhân IT” là giãy nãy lên rồi.

A nên nhớ trong thế giới này ko phải Perfect World và tất cả mọi thứ đều phải đánh đổi. Một ng gọi là giỏi là người có thể đạt được mục tiêu trong các điều kiện giới hạn chứ ko phải điều kiện hoàn hảo.

Cái tình huống bên trên tôi đưa ra là một tình huống thực tế. Nếu anh ko phải là thợ code thì a phải giải quyết dc nó với các ràng buộc như vậy. Chứ ko phải là chỉ biết chửi team, chửi sếp, chửi dự án, chửi khách hàng rồi đập bàn nghỉ, bỏ chạy đi chổ khác thôi. :look_down:


via theNEXTvoz for iPhone
A nói chán bỏ mẹ, dự án ngay từ đầu đã ko testable, khách hàng ko quan tâm đến UN, ko có budget cho UN thì khiến anh đi viết UN à? Ở đây đang nói chuyện viết UN thế nào cho nó hiệu quả, tức là nói đến những project có điều kiện để viết UN. Tôi đéo hiểu a đang muốn thể hiện cái gì nữa? Còn dự án thối, thì đời code dạo có ông nào ko gặp mà anh cứ lu loa lên như thể mình a cân cả thế giới thế.
P/s 1 tuần tôi phỏng vấn 5,7 chú. Junior có, senior có, nhưng nếu chỉ đọc sách, ko trải qua thực tế mà đòi chém gió thì còn mơ.
 
Mời anh đọc lại #103 và #114 của tôi. Hình như tôi chưa bao giờ nói UT là thừa cả.
Mời anh đọc lại title của thread nhé :)
Còn a bảo là chỉ dc bàn vấn đề kỹ thuật thì tôi lượn thôi vì mấy cái đó nó quá cơ bản, a hỏi 1 thằng sv hay đọc sách thì đều chém đc hết.
Thật luôn!!???? :LOL: chỉ cần đọc sách là chém được luôn!!??? quá cơ bản luôn!!??? :LOL: xin lỗi anh nhưng trình độ junior mà tôi gặp (thậm chí inter hay senior) thì 10 thằng chưa thấy thằng nào biết viết UT thế nào cho đúng hay thể hiện đúng tư tưởng của việc viết UT :LOL:
A nên nhớ trong thế giới này ko phải Perfect World và tất cả mọi thứ đều phải đánh đổi. Một ng gọi là giỏi là người có thể đạt được mục tiêu trong các điều kiện giới hạn chứ ko phải điều kiện hoàn hảo.
Cái này không cần anh phải nói mà ai có kinh nghiệm hoặc kinh qua nhiều code base như c** hoặc team như c** là đều biết á anh :)
Cái tình huống bên trên tôi đưa ra là một tình huống thực tế. Nếu anh ko phải là thợ code thì a phải giải quyết dc nó với các ràng buộc như vậy. Chứ ko phải là chỉ biết chửi team, chửi sếp, chửi dự án, chửi khách hàng rồi đập bàn nghỉ, bỏ chạy đi chổ khác thôi. :look_down:
Tôi nói thật với anh nhé. Anh cứ giữ cái tư tưởng ấy thì sẽ mãi mãi ngập trong đống c** hoặc chuyển từ ngập ngụa trong đống c** này sang ngập ngụa trong đống c** khác mà tôi :) vì mindset của anh từ đầu nó đã là chấp nhận cái "sự thật" mà anh hay nhắc ý :) anh nếu là manager thì tôi cũng chỉ đánh giá anh "thợ quản lý" mà thôi :) luôn bị deadline dí và nghĩ nó là bình thường chứ đ biết làm sao để khắc phục việc đấy và chưa bao giờ nghĩ đến chuyện làm sao để tránh lặp lại việc vô nghĩa như thế :) trong đầu chỉ luôn nghĩ đến chuyện deliver sản phẩm đúng hạn là được chứ đ có 1 chút lòng tự trọng hay tự hào nào về thứ mà mình làm ra luôn :)
 
Hình như có cách phát triển app theo hướng viết test trước - viết code sau thì phải (test-driven development) ._.
 
TDD là cái thứ "quái thái" đi ngược lại suy nghĩ bình thường của software development. Nó như là một trend nhất thời chứ hiệu quả thật sự ko bao nhiêu. :ah:

Cái suy nghĩ "viết test trước rồi viết code sau" nó thật sự bullshit! :misdoubt::shame:
 
Sửa lần cuối:
TDD là cái thứ "quái thái" đi ngược lại suy nghĩ bình thường của software development. Nó như là một trend nhất thời chứ hiệu quả thật sự ko bao nhiêu. :ah:

Cái suy nghĩ "viết test trước rồi viết code sau" nó thật sự bullshit! :misdoubt::shame:
Không liên quan nhưng mà bác cho e xin thêm dẫn chứng về lập luận tại sao nó quái thai/bu**sh*t?. Nào cũng có cái điểm mạnh và điểm yếu, tùy vào cân nhắc nếu ưu tiên điểm mạnh thì chọn, ưu tiên rơi vào điểm yếu thì không chọn thôi bác.
 
Không liên quan nhưng mà bác cho e xin thêm dẫn chứng về lập luận tại sao nó quái thai/bu**sh*t?. Nào cũng có cái điểm mạnh và điểm yếu, tùy vào cân nhắc nếu ưu tiên điểm mạnh thì chọn, ưu tiên rơi vào điểm yếu thì không chọn thôi bác.

Làm cái gì cũng vậy phải thử làm mới biết mình sai. Quá trình phát triển của một cái gì đó bao giờ cũng là:

Thử làm -> Sai -> Sửa

Khi code có những case bắt tay vào code rồi mới lòi ra phải xử lý, lúc đó mới có test case mới. Cái tư tưởng "test trước code sau" là đi ngược lại quá trình làm việc thông thường (thử -> sai -> sửa). Chứ ngồi nghiệm ra test case rồi các tình huống trc khi bắt đầu làm thì tôi thấy nó bullshit lắm vì nó tốn thời gian, bỏ effort cho việc nghĩ test case nhưng thật sự tại thời điểm đó lúc chưa bắt tay vào code thì cũng ko thể nghĩ ra đầy đủ các test cases dc.

Vừa code vừa viết test thì a lại mất focus. Nên cách làm thông thường là code trước, note lại các case cần viết test, code xong xuôi hết rồi viết UT là hợp lý hơn.

Còn ko thì cái thằng viết Test và thằng viết Code là 2 thằng riêng biệt y như QC với Dev vậy. TDD là cái bullshit thế nhưng nhiều anh cứ áp dụng máy móc rồi tỏ ra mình hay... Tôi là người thực dụng nên cái gì vớ vẩn là bỏ, quan trọng là effort bỏ ra + hiệu quả phải tương xứng. Nếu TDD tuyệt vời như vậy thì phải thấy cả ngành phần mềm chuyển sang làm TDD hết rồi.

Còn việc điểm mạnh yếu gì gì đó thì đôi khi cách giải quyết vấn đề ko phải là áp dụng TDD mà phải giải quyết chổ khác. Bởi vậy tôi hay nói "vấn đề nằm ở đâu" quan trọng hơn là giải quyết vấn đề thế nào.
 
Em đi làm 3 chỗ rồi mà chưa làm project nào có unit test hỏi mấy a làm trước thì bảo viết cũng được mà lười. Còn em tự đọc tài liệu trên mạng thấy toàn ví dụ rất đơn giản không áp dụng được gì mấy kiểu: assertEqual(add(1,1), 2) :sad:
Cách viết đây nhé:

  • Thiết lập các điều kiện cần thiết bao gồm khởi tạo các đối tượng, xác định tài nguyên cần thiết, xây dựng các dữ liệu giả.
  • Gọi các phương thức cần kiểm tra.
  • Kiểm tra sự hoạt động đúng đắn của các phương thức.
  • Dọn dẹp tài nguyên sau khi kết thúc kiểm tra.
 
Sẽ tới giai đoạn mà mọi người nhận ra Test (unit test, integration test ...) cực kì quan trọng.
  • Trong quá trình viết test sẽ nhận ra code chỗ nào chưa hợp lý, cần refactor lại
  • Hầu như code ko bao giờ tồn tại vĩnh viễn thì cần implement tính năng, refactor liên tục => test giúp bảo vệ những logic cũ
  • Test coverage phần nào phản ánh chất lượng sản phẩm, đôi khi là yêu cầu của khách hàng hoặc nhiều flow ci/cd cần phải đạt % test coverage thì mới được deploy
Tất nhiên với service nhỏ, đơn giản hoặc là startup cần đánh đổi chất lượng với tốc độ phát triển thì bỏ qua test TRONG GIAI ĐOẠN ĐẦU là điều thường gặp.
 
Thật sự mấy cty Oursource ít khi viết UT, qua cty product viết lòi họng luôn, estimate implement time = unit-test time, rồi dính UI thì phải viết cả cypess.
UT cực kì quan trọng
 

Thống kê chủ đề

Ngày tạo
TrungNgaoNgo,
Người trả lời cuối
vozphongtrao1,
Trả lời
180
Lượt xem
29.197
Quay lại
Lên đầu trang