Làm thế nào bạn đã làm cho thử nghiệm đơn vị thú vị hơn? [đóng cửa]


18

Nếu bạn luôn yêu thích thử nghiệm đơn vị, tốt cho bạn! Nhưng đối với những người không may mắn sinh ra không thích nó, làm thế nào bạn quản lý để làm cho nhiệm vụ này thú vị hơn?

Đây không phải là một câu hỏi "cách đúng để kiểm tra đơn vị". Tôi chỉ đơn giản muốn biết ít thủ thuật cá nhân làm giảm sự nhàm chán (dám nói) của việc viết bài kiểm tra đơn vị.


1
Tôi thích viết các bài kiểm tra đơn vị và các bài kiểm tra khác một phần bởi vì mọi người đều thích nó (đôi khi họ cũng rất thích làm các công cụ mà tôi đang kiểm tra). Không, tôi không hút như một nhà phát triển. Tôi chỉ thích khả năng sử dụng, kẹo mắt và tự động hóa. Các MbUnitthư viện đã thay đổi cuộc đời tôi. Kiểm tra tự động là quan trọng. Kiểm tra tự động tiết kiệm thời gian. Kiểm tra tự động tiết kiệm tiền. Kiểm tra tự động có thể cứu sống. Kiểm tra tự động là cách duy nhất. Tự động kiểm tra là một mạng lưới an toàn khác. Khi tôi là một trong 50 người làm việc trên một kiến ​​trúc khổng lồ, tôi cảm thấy như một viên gạch khác trong một bức tường. Với các bài kiểm tra đơn vị tôi đang kiểm soát.
Công việc

Lười biếng và thất vọng khi thử nghiệm đơn vị là một phản ứng bình thường để làm việc mà não của chúng ta coi là vô dụng. Tôi ghét viết và duy trì các bài kiểm tra đơn vị có ROI ít hoặc âm. Tuy nhiên, viết các bài kiểm tra hữu ích là một công việc thú vị nhưng tự nó là một kỹ năng để nhận ra những gì hữu ích và rác là gì. Có một anh chàng đang viết một cuốn sách về chủ đề này dựa trên blog của anh ấy, bạn có thể đọc tại đây: enterpriseccraft
Skill.com/2016/06/01/ chủ

Câu trả lời:


22

Đầu tiên, tôi đồng ý với bạn - nếu bạn đang viết bài kiểm tra đơn vị của mình trên mã đã hoàn thành hoặc bạn đang tự kiểm tra đơn vị mã của mình, tôi cũng thấy điều đó vô cùng nhàm chán.

Tôi thấy có hai cách kiểm tra đơn vị đối với tôi thực sự làm cho nó thú vị:

  1. Bằng cách sử dụng Phát triển hướng thử nghiệm (TDD) - viết các thử nghiệm trước tiên cho phép tôi suy nghĩ về phần chức năng hoặc hành vi tiếp theo mà tôi cần trong mã của mình. Tôi thấy việc lái xe hướng đến mục tiêu cuối cùng của mình trong những bước nhỏ và thấy tiến bộ rõ rệt hướng tới mục tiêu đó cứ sau vài phút cực kỳ bổ ích và thú vị.
  2. Khi có lỗi, thay vì đi thẳng đến trình gỡ lỗi, đó là một thử thách thú vị để tìm ra cách viết một bài kiểm tra đơn vị thất bại để tái tạo lỗi. Cuối cùng, tôi rất hài lòng khi tìm ra các trường hợp khiến mã của bạn bị lỗi, sau đó sửa nó và xem thanh chuyển sang màu xanh lục cho thử nghiệm thất bại mới (và giữ màu xanh cho tất cả các thử nghiệm hiện tại của bạn).

12

Ưu thế tự mãn.

Tôi chỉ nửa đùa nửa thật. "Hãy nhìn tôi, rèn luyện thói quen lập trình tốt! Công cụ 'kiểm thử đơn vị' này là điều mà tôi từ mười năm trước chưa bao giờ làm được - thật là một kẻ ngốc! Và chỉ cần nghĩ về tất cả các lỗi tôi sẽ mắc phải là kết quả của công việc nhàm chán, tẻ nhạt này tôi đang làm ngay bây giờ - mã của tôi sẽ rất tuyệt! Tôi chắc chắn sẽ được tăng lương! * "

* - Không, tôi sẽ không.

Tôi thấy nó giống như làm việc hoặc ăn uống lành mạnh; cho đến khi những lợi ích hữu hình thực sự phát huy ("Quả bóng thần thánh, tôi thực sự đang mắc phải một lỗi lỗi hồi quy có thể xảy ra!"), niềm tự hào về đạo đức khi biết rằng bạn đang làm The Right Thing có thể giúp bạn mang theo xuyên qua.


7

Đối với một, tôi gần như không bao giờ chỉ ngồi đó và viết bài kiểm tra đơn vị. Các bài kiểm tra đơn vị là một phương tiện để kết thúc, không phải là kết thúc trong chính họ. Chúng là một cách trả lời "mã này có thực hiện nhiệm vụ cơ bản mà nó được cho là không."

Chẳng hạn, một số người sẽ viết một hàm và sau đó mở một phiên tương tác để kiểm tra nó trên một vài giá trị và đảm bảo rằng nó hoạt động:

def fact x
  if x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact 10
=> 3628800
>> fact 7
=> 5040

Nhưng bây giờ bạn phát hiện ra một lỗi:

>> fact -1
SystemStackError: stack level too deep
    from (irb):2:in `fact'
    from (irb):5:in `fact'
    from (irb):10

Vì vậy, bạn sửa nó:

def fact x
  if x < 0
    raise "Can't take the factorial of a negative number"
  elsif x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact -1
RuntimeError: Can't take the factorial of a negative number
    from (irb):3:in `fact'
    from (irb):10

Nhưng bây giờ bạn thực sự phải kiểm tra để đảm bảo nó vẫn hoạt động:

>> fact 10
=> 3628800
>> fact 7
=> 5040

Như bạn có thể thấy, bạn tiếp tục lặp lại các bài kiểm tra tương tự ... và bạn phải so sánh kết quả một cách trực quan. Kiểm tra đơn vị là một cách để tránh sự lặp lại trong trường hợp này; nó làm giảm bao nhiêu công việc bạn cần làm. Và trong khi đây là một ví dụ nhỏ ngớ ngẩn, trong thế giới thực, nó ngày càng trở nên quan trọng hơn và ngày càng khó kiểm tra bằng tay. Tất nhiên, điều này có nghĩa là mọi người chỉ đơn giản là không kiểm tra các thành phần riêng lẻ; họ chỉ kiểm tra toàn bộ chương trình. Nhưng sau đó, bọ xít mọc lên và chúng khó tìm hơn nhiều. Hoặc có lỗi xảy ra và chúng đã được sửa, nhưng ai đó lại giới thiệu cùng một lỗi, vì không ai thêm trường hợp kiểm tra để đảm bảo điều đó không xảy ra. Hoặc ai đó nhìn vào một đoạn mã lớn và nói "Tôi không biết việc này phải làm gì, vì nó không được ghi chép lại và không có bài kiểm tra nào ... nếu tôi sửa lỗi này, tôi không biết liệu tôi có phá vỡ thứ gì khác hay không; có lẽ tôi sẽ viết lại cái này từ đầu. "

Kiểm tra đơn vị làm giảm tất cả các công việc làm thêm trong những trường hợp này. Cách tốt nhất để khiến họ vui vẻ là đảm bảo rằng mọi người hiểu tất cả các công việc mà họ đang thay thế, và sự linh hoạt thêm đến từ việc biết mỗi đoạn mã phải làm gì. Ở một mức độ nào đó, mọi người cần có thêm một chút kinh nghiệm với việc viết và duy trì một cơ sở mã lớn để hiểu thử nghiệm đơn vị quan trọng như thế nào; nếu tất cả mã của họ là thứ họ viết một lần và vứt đi, họ sẽ không bao giờ có được nó.

Và các bài kiểm tra đơn vị không nên được viết sau khi thực tế, như một việc vặt thêm một khi bạn có mã mà bạn "biết" đã hoạt động. Các bài kiểm tra đơn vị nên được viết trước, hoặc ít nhất (vì đôi khi bạn quên viết chúng trước) ngay sau khi viết mã trong câu hỏi. Đây được gọi là phát triển thử nghiệm điều khiển, và nó có thể giúp làm cho các API của bạn tốt hơn; nếu bạn viết các bài kiểm tra thực hiện API trước, bạn sẽ biết API sử dụng ở đâu trước khi bạn viết mã và có thể thiết kế lại dễ dàng hơn nhiều so với việc bạn chỉ thêm các bài kiểm tra sau đó.


@Biran, tôi đồng ý. Nhưng tất cả điều đó làm cho nó là "đúng". Nhưng làm thế nào để làm cho nó thú vị? Thậm chí một chút?
Preets

@Preets Thật thú vị vì bạn đang tránh thực hiện kiểm tra thủ công lặp đi lặp lại. Thật thú vị hơn khi bạn thực hiện nó trước , trái ngược với thực tế, bởi vì nó trở thành một phần của quá trình thiết kế, chứ không phải là một công việc thực tế cho mã đã "hoạt động".
Brian Campbell

Vì vậy, hãy dành thời gian làm việc đó nặng nề, do đó làm nó QUYỀN cảm thấy vui vẻ bằng cách so sánh? ... Đó là công việc sức mạnh, thực sự ....
BlairHippo

@Biran, tôi đồng ý, người ta phải làm điều đó "trước tiên" - không chỉ để loại bỏ sự nhàm chán, mà tôi cho rằng đó là cách làm đúng đắn để đạt được những lợi ích thực sự của thử nghiệm đơn vị.
Preets

@Biran, Cảm ơn bạn! Gần đây tôi đã sử dụng TDD trên một dự án sở thích của tôi và nó làm thay đổi cách nghĩ về kiểm tra đơn vị.
Preets

5

Tôi không biết. Điều chắc chắn làm cho việc kiểm thử đơn vị trở nên thú vị hơn đối với tôi là suy nghĩ về tất cả các sửa lỗi bực bội, dài dòng, nhàm chán và không được giải quyết mà tôi sẽ không trải qua mỗi khi tôi thay đổi phần mềm :)


2
Điều đó thật thú vị. Bởi vì cá nhân, khi ai đó tìm thấy một lỗi trong mã của tôi, tôi đã vùi đầu vào sự xấu hổ, nhưng đồng thời, quá trình gỡ lỗi đối với tôi thực sự khá thú vị và thú vị hơn khi thử nghiệm đơn vị. Nó giống như giải một câu đố mà bạn phải bắt con bọ lén lút đó.
Preets

@Preets: Tôi đồng ý, đôi khi nó có thể thú vị, nhưng đối với tôi, thiết kế thú vị hơn nhiều so với thực hiện. Vì vậy, tôi không muốn dành nhiều thời gian để thực hiện. Tôi thích nó là thẳng về phía trước và có thể dự đoán được, đặc biệt là vì nó cho phép thực hiện lịch trình thời gian đáng tin cậy hơn. Nhiều như tôi thích quá trình tạo ra phần mềm, tôi nghĩ rằng kết quả là quyết định.
back2dos

Ồ tôi hoàn toàn đồng ý! Một hệ thống với các lỗi ngẫu nhiên có thể gây ra những đêm mất ngủ .. sự lựa chọn của tôi chỉ đơn giản là một sở thích trong một thế giới không thực, nơi không có gì khác ngoài việc vui chơi!
Preets

3

Sự vượt trội tự mãn mà bạn cảm thấy khi bạn kiểm tra mã đó là vững chắc, mạnh mẽ và ổn định. Và nếu bạn viết các bài kiểm tra đơn vị bằng một công cụ bao phủ mã, bạn có thể tự hào khi kiểm tra nhận xét rằng phạm vi bảo hiểm mã của bạn là 90% hoặc cao hơn.


3

Rõ ràng, có sự hài lòng của sự phát triển thử nghiệm đầu tiên và cảm giác bạn nhận được khi thiết kế và thử nghiệm của bạn kết hợp với nhau. Tuy nhiên, các bài kiểm tra viết cho mã có sẵn / di sản có thể gây khó chịu và bực bội. Khi dự án của chúng tôi ở trong một mô hình bảo trì, tôi đã viết các bài kiểm tra cho mã chưa được kiểm tra bằng cách sử dụng báo cáo bảo hiểm như một trò chơi. Bạn có thể tạo một chút cạnh tranh với chính mình và / hoặc những người khác để tăng số lượng bảo hiểm. Cấp, bạn có thể đưa nó đi quá xa và tạo ra một số bài kiểm tra tồi, nhưng nó có thể là một động lực tốt.


vì mã kế thừa thường không dễ kiểm tra, tôi thấy mình phải vật lộn để viết các bài kiểm tra đơn vị tốt - vì vậy, không chỉ quá trình đau đớn, mà kết quả (kiểm tra đơn vị) cũng không đặc biệt hữu ích: - / Tôi thấy khó chịu nhất .. . Các trò chơi bảo hiểm là một trong những tốt mặc dù :)
Preets

1

Hãy cố gắng để có được vào Flow . Đặt mục tiêu khó khăn, nhưng có thể đạt được cho chính mình. Điều gì có thể là một mục tiêu trong thử nghiệm đơn vị? Ví dụ, cố gắng viết nhanh hơn trong khi vẫn giữ được chất lượng. Các bài kiểm tra đơn vị không đòi hỏi quá nhiều suy nghĩ nên việc nhầm lẫn là không thể. Tập trung vào mục tiêu của bạn và kiểm tra thường xuyên để xem khi bạn đang ở gần nó.


Ás, tại sao bạn nói kiểm tra đơn vị không yêu cầu quá nhiều suy nghĩ? Nếu bạn làm việc với TDD, nó liên quan đến rất nhiều suy nghĩ. Điều đó có đúng không?
Preets

Bạn nói đúng, tôi đã không tính đến TDD.
Tamás Szelei

0

Đôi khi để có được bản thân mình năng động, tôi sẽ viết xuống hiện tại "mã số bảo hiểm" của tôi vào lúc bắt đầu trong ngày. Sau đó, mỗi lần tôi viết một thử nghiệm và nhận được nó để vượt qua, tôi sẽ chạy bộ, và cập nhật số lượng vùng phủ sóng. Đó là niềm vui, và nó giúp nhắc nhở tôi tại sao tôi đang làm điều này. (Có nhiều lý do khác nữa, nhưng tôi giống như những con số. Có lẽ đó chỉ là tôi!)


0

Bằng cách không cố gắng ảo tưởng rằng tôi có thể đánh lừa tâm trí của mình để nghĩ rằng thử nghiệm đơn vị có thể thú vị trong bất kỳ khoảng thời gian bền vững nào.

Chấp nhận thực tế rằng thử nghiệm đơn vị không có ở đó sẽ giúp tôi rất nhiều, khiến tôi nhận ra rằng tôi đang tìm kiếm thứ gì đó ở một nơi mà nó không bao giờ được cho là.

Trong những chuyến du ngoạn tinh thần ngắn ngủi này khi tôi đạt đến điểm nhận thức thử nghiệm đơn vị để trở thành thực sự của nó, tức là một nhiệm vụ tàn nhẫn, không chịu nổi và vô cùng buồn tẻ, tôi tự hỏi mình có đủ khả năng buông bỏ chúng không, tức là không có đảm bảo cao về tính chính xác chức năng.

Lúc nào cũng vậy, câu trả lời là "không" vang dội.

Khi chấp nhận số phận của mình, tôi tiếp tục đẩy những vật thể vuông này bằng chữ, số và ký hiệu trên chúng trước mặt, mà chúng ta gọi là bàn phím, biết từ trải nghiệm đầu tiên rằng với mỗi lần nhấp bàn phím, kết thúc kiểm tra đơn vị sẽ gần hơn với nó đã bao giờ được.


Không phải mọi bài kiểm tra là tốt hay hữu ích. Đây là điều mà TDD'ers và các nhà truyền giáo thử nghiệm khác thường không đề cập đến. Tôi cá là trong một số khoảnh khắc hiếm hoi bạn thích thử nghiệm đơn vị khi bạn biết rằng nó kiểm tra logic phức tạp, thử nghiệm là thanh lịch và không được kết hợp để thực hiện, và khá ghét khi bạn bị buộc phải thử nghiệm tào lao tầm thường chỉ để đạt được một số mục tiêu bảo hiểm mã lunatic theo yêu cầu hướng dẫn dự án.
KolA

@KolA Bạn đúng rằng có những bài kiểm tra đơn vị đầy thách thức đòi hỏi sự sáng tạo, nhưng viết bài kiểm tra đơn vị vô tận có thể hút niềm vui ra khỏi những bài kiểm tra thú vị.
lỗi chân
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.