Có bất kỳ khung kiểm tra đơn vị bất khả tri ngôn ngữ? [đóng cửa]


11

Tôi luôn hoài nghi về việc viết lại mã làm việc - mã porting cũng không ngoại lệ. Tuy nhiên, với sự ra đời của TDD và kiểm tra tự động, việc viết lại và tái cấu trúc mã sẽ hợp lý hơn nhiều.

Có ai biết nếu có một công cụ TDD có thể được sử dụng để chuyển mã cũ? Lý tưởng nhất bạn có thể làm như sau:

  1. Viết các bài kiểm tra đơn vị bất khả tri ngôn ngữ cho mã cũ vượt qua (hoặc thất bại nếu bạn tìm thấy lỗi!).
  2. Chạy thử nghiệm đơn vị trên cơ sở mã khác của bạn không thành công.
  3. Viết mã bằng ngôn ngữ mới của bạn vượt qua các bài kiểm tra mà không cần nhìn vào mã cũ.

Giải pháp thay thế sẽ là tách bước 1 thành "Viết các bài kiểm tra đơn vị bằng ngôn ngữ 1" và "Kiểm tra đơn vị cổng thành ngôn ngữ 2", điều này làm tăng đáng kể nỗ lực và rất khó để biện minh nếu cơ sở mã cũ sẽ ngừng được duy trì sau cổng (nghĩa là bạn không nhận được lợi ích của việc tích hợp liên tục trên cơ sở mã này).

EDIT: Đáng chú ý câu hỏi này trên StackOverflow.


Cung cấp một giao thức lệnh văn bản thuần túy, và sau đó sử dụng expectđể thực hiện các thử nghiệm của bạn.
SK-logic

@ SK-logic tôi chưa nghe nói đến expect. Nếu bạn có một hệ thống kế thừa kiểu Unix giao tiếp với các đường ống bằng cách sử dụng stdin và stdout thì công cụ đó có thể được sử dụng chắc chắn. Trên thực tế, nó cũng khá dễ dàng để kiểm tra với bất kỳ ngôn ngữ kịch bản nào.
Bringer128

Tại sao di sản? Bạn có thể có một hệ thống hiện đại theo phong cách unix là tốt. Dù sao, không bao giờ tồn tại một lời biện minh hợp lệ cho việc không cung cấp giao diện kịch bản cho bất kỳ phần chức năng nào.
SK-logic

@ SK-logic Xin lỗi vì đã không rõ ràng. Tôi đã nói "di sản" bởi vì chuyển thường được thực hiện từ legacy language xđến fancy new language y. Tôi đã không cố gắng ám chỉ bất cứ điều gì về Unix!
Bringer128

@ Bringer123, nhân tiện, mẹo nhỏ của tôi để thực hiện loại tích hợp giống như không có sự hỗ trợ Unix tốt này (ví dụ: không có ống dẫn thích hợp) là nhúng ngôn ngữ kịch bản và cung cấp quyền truy cập vào REPL của nó qua cổng TCP (với REPL chạy trong một luồng riêng biệt). Nó là cả một công cụ sửa lỗi mạnh mẽ và kiểm tra công cụ tự động hóa. Và cách tiếp cận này hoạt động với mọi thứ theo nghĩa đen (một ngôn ngữ kịch bản nhúng có thể rất nhỏ, thậm chí nó có thể là một Forth trong một kịch bản tài nguyên giới hạn).
SK-logic

Câu trả lời:


6

Tôi không nghĩ có thể viết bài kiểm tra đơn vị bằng một ngôn ngữ khác.

Tuy nhiên, những gì bạn có thể làm là viết các bài kiểm tra tích hợp / chấp nhận / giao diện người dùng / whaterver_you_name_it ở mức rất cao và sẽ không bị ràng buộc với ngôn ngữ mà phần mềm của bạn được viết.

Nếu ứng dụng của bạn là một dịch vụ web, bạn có thể kiểm tra nó với bất kỳ ngôn ngữ nào bạn muốn, miễn là nó hỗ trợ giao thức của bạn. Nếu ứng dụng của bạn chạy trên trình duyệt, bạn có thể sử dụng selen (đó là lần đầu tiên tôi nghĩ đến, nhưng có những ứng dụng khác. V.v. Có thể có một số trường hợp nó không hoạt động như tôi tưởng tượng (có thể là phần cứng), tất cả phụ thuộc vào về loại ứng dụng bạn đang làm việc.

Tất nhiên, bạn sẽ không có phạm vi bảo hiểm giống như bạn có với các bài kiểm tra cấp độ đơn vị (trừ khi dành nhiều thời gian), nhưng ít nhất, bạn sẽ có một khai thác thử nghiệm.


+1 cho các bài kiểm tra cấp cao tự động. Đây chắc chắn sẽ là giá trị nỗ lực để sản xuất.
Bringer128

1
"Tôi không nghĩ có thể viết bài kiểm tra đơn vị bằng một ngôn ngữ khác." : ví dụ truy cập: trong .NET, bạn có thể viết các bài kiểm tra đơn vị của C # bằng Visual Basic (hoặc bất kỳ ngôn ngữ hỗ trợ .NET nào khác). Một vài năm trước, điều này thậm chí còn được Microsoft quảng bá là một cách thực hành tốt nhất, vì nó làm giảm rủi ro tạo cả mã và kiểm tra cùng một lỗi liên quan đến ngôn ngữ (và cụ thể là sự hiểu lầm tương đối của lập trình viên về nó). Đồng ý, người ta sẽ không viết các bài kiểm tra đơn vị trong Fortran để kiểm tra mã PHP.
Arseni Mourzenko

2

Tôi nghĩ những gì đến gần nhất với ý tưởng của bạn là các khung kiểm tra đơn vị trên các hệ sinh thái dựa trên máy ảo như Java VM. Ít nhất Scala (và tôi cũng tin Groovy - tôi không chắc lắm về Clojure) gần như hoàn toàn tương thích với Java. Nghĩa là, mã Scala có thể được kiểm tra bằng JUnit và mã Java có thể được kiểm tra bằng ScalaTest. Bằng cách này, bạn có thể (dần dần hoặc cùng một lúc) viết lại mã Java trong Scala và tiếp tục sử dụng các thử nghiệm đơn vị Java cũ để xác minh tính chính xác của nó. (Hoặc theo cách khác - mặc dù tôi không thể tưởng tượng được lý do hợp lệ để di chuyển từ Scala trở lại Java.)

Có lẽ điều tương tự cũng đúng với các ngôn ngữ trên .NET CLI, ví dụ C #, F #, ASP.NET et al.

Tuy nhiên, bên ngoài VM / CLR thì khó khăn hơn. Về lý thuyết, người ta có thể biên dịch các bài kiểm tra đơn vị và / hoặc mã được kiểm tra sang một ngôn ngữ khác như C (như đã và phổ biến với các ngôn ngữ mới như C ++ đầu tiên, v.v.), nhưng tôi chưa từng nghe về bất kỳ ai đang thử cụ thể với kiểm tra đơn vị.


1
Tôi đoán điều này cho thấy vấn đề với câu hỏi của tôi. Nếu họ có thể tương tác dễ dàng, tại sao cổng? Và nếu họ không thể, thì rào cản ngôn ngữ khiến cho các bài kiểm tra đơn vị ngôn ngữ chéo không thể thực hiện được.
Bringer128

@ Bringer128, những người đề xuất giống ngôn ngữ JVM mới cho rằng các vấn đề cụ thể có thể được giải quyết nhanh hơn, với mã ít hơn và sạch hơn đáng kể so với Java. Kinh nghiệm hạn chế của tôi với Scala xác nhận điều này cho đến nay.
Péter Török

Groovy cũng tương tác với Java.
user281377

1

Khung như vậy không tồn tại, bởi vì nó cần được viết bằng ngôn ngữ của mã được sử dụng.

Ví dụ, một khung để kiểm tra mã c ++ cần được viết bằng c hoặc c ++. Có thể sử dụng framework được viết bằng c ++, nhưng sẽ không kiểm tra mã ac nếu nó sử dụng các tính năng của c ++.


1

Phương pháp luận khác nhau, nhưng trong trường hợp của tôi, một phần lớn các bài kiểm tra TDD của tôi có xu hướng theo kiểu 'kiểm tra tích hợp', trái ngược với 'kiểm tra đơn vị'. Đó là, hầu hết trong số họ kiểm tra toàn bộ chương trình trong các truy vấn gần như ngoài đời thực, kiểm tra các phản hồi phù hợp.

Trong một số trường hợp, khi tôi viết các chương trình điều khiển mạng (hầu hết là các giao thức dành riêng cho ứng dụng), tôi không có một khung kiểm tra đầy đủ tiện dụng mà cảm thấy dễ dàng cho công việc, vì vậy tôi đã thực hiện hầu hết các thử nghiệm 'trên toàn mạng', trong Nói ngắn gọn, tôi đã viết một ứng dụng khách rất đơn giản bằng một ngôn ngữ khác với khung kiểm tra chung và đơn giản, và hầu hết các bài kiểm tra đã kiểm tra phản hồi của máy chủ.

Tuy nhiên, ngay cả trong những trường hợp đó, tôi đã tiêm một vài thử nghiệm cuộn bằng tay trong ứng dụng thực tế để kiểm tra một số phần không thuộc mạng.


0

Khung kiểm tra bất khả tri ngôn ngữ là khung kiểm tra chung phù hợp với kiểm tra chấp nhận (quan điểm) và các kiểm tra trong khung đó được quản lý bởi QA, ví dụ như Robotframework


2
điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 4 câu trả lời trước
gnat
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.