Ruby의 커널 클래스에 assert () 메소드를 추가하는 것이 관용적 인 Ruby입니까?
Kent Beck의 xUnit을 Ruby로 코딩하여 Ruby 이해를 확장하고 있습니다. Python (Kent가 작성)에는 많은 사용되는 언어로 assert () 방법이 있습니다. 루비는 말할 것입니다. 나는 이것을 추가하는 것이 쉬울 생각하지만 커널이 그것을 그것을 그것을 올바른 장소입니까?
BTW, 저는 Ruby에 다양한 Unit 프레임 워크가 존재한다는 것을 알고 있습니다. 이 "무언가를 수행하기"보다는 Ruby 관용구를 배우기위한 연습입니다.
아니요, 모범 사례가 아닙니다. Ruby에서 assert ()에 대한 가장 좋은 비유는
raise "This is wrong" unless expr
보다 구체적인 예외 처리를 제공하는 고유 한 예외를 구현할 수 있습니다.
Ruby에서 주장을 사용하는 것이 전적으로 타당하는 것이 생각합니다. 그러나 두 가지 다른 것을 발견하고 있습니다.
- xUnit 프레임 워크는
assert테스트 기대치를 확인 하는 방법을 사용 합니다. 애플리케이션 코드가 아닌 테스트 코드에서 사용하기위한 것입니다. - C, 자바 또는 파이썬 같은 일부 언어과에는
assert프로그램의 무결성에, 대한 가정을 확인하기 위해 프로그램 코드 내에서 사용되는 구조가 포함 되어 있습니다. 다음 검사는 코드 유전자 유전자 구축됩니다. 테스트 타임 유틸리티가 아니라 개발 타임 유틸리티입니다.
나는 최근에 solid_assert를 썼다 : Ruby assertion 유틸리티를 구현하는 작은 Ruby 라이브러리 와 그것의 동기를 설명하는 내 블로그의 글 도 .. 다음과 같은 형식으로 사용할 수 있게 .
assert some_string != "some value"
assert clients.empty?, "Isn't the clients list empty?"
invariant "Lists with different sizes?" do
one_variable = calculate_some_value
other_variable = calculate_some_other_value
one_variable > other_variable
end
그리고 그렇게 할 평가 할 수 assert및 invariant빈. 이를 통해 성능 문제를 피할 수 있습니다. 그러나 The Pragmatic Programmers 는하지 말 것을 권장합니다. 실제로 성능에 영향을 미치는 경우에만 있어야합니다.
관용적 인 루비 방식이 평범한 raise문장을 사용하고 답에 서술 력이 부족하다고 생각합니다. 단정적 인 프로그래밍의 황금률 중 하나는 예외 처리에 단정을 사용하지 않는 것입니다. 완전히 완전히 다른 두 가지입니다. 둘 중 동일한 구문을 코드가 더 모호 사용하는 것이 생각합니다. 물론 기능을 잃게됩니다.
마스터에 저니에서 실용주의 프로그래머 및 코드 완료 와 같은 두 권의 필독 고전 책 이 전체 섹션을 전용하고 사용을 권장 하기 때문에 단언을 사용하는 것이 좋은 것이라고 확신 할 수 있습니다 . 또한 모든 어설 션 이있는 프로그래밍 이라는 제목의 멋진 기사가 있어 어설 션 프로그래밍이 무엇인지, 언제 있는지 잘 설명합니다 (Java 기반이지만 개념은 언어에 적용됨).
커널 모듈에 assert 메서드를 추가 한 이유는 무엇입니까? Assertions또는 다른 모듈을 사용하지 않는 이유는 무엇입니까?
이렇게 :
module Assertions
def assert(param)
# do something with param
end
# define more assertions here
end
당신의 주장이 필요 어디에서나 사용 가능하다면 다음과 같이하십시오 :
class Object
include Assertions
end
면책 조항 : 코드를 테스트 전면 원칙적으로 이렇게 할 것입니다.
특별히 관용적이지는 않지만 좋은 생각이라고 생각합니다. 특히 이렇게하면 :
def assert(msg=nil)
if DEBUG
raise msg || "Assertion failed!" unless yield
end
end
이렇게하면 DEBUG (또는 다른 스위치, 과거에 Kernel.do_assert를 사용 했음) 세트로 실행하지 않기로 결정해도 영향이 없습니다.
내 이해는 Ruby에 더 익숙해지는 방법으로 자신의 테스트 스위트를 작성하고 모든 것입니다. Test :: Unit이 가이드로 유용 할 수 있습니다. (이미 작업이 완료되었으므로).
즉, 확실한 주장은 (적어도 나에게는) C의 assert (3) 와 더 유사합니다 . 단위 테스트를 위해 일반적으로 "이런 일이 발생하는 것이 아니라"
Ruby에 내장 된 단위 테스트가 문제를 보는 경향은 각 개별 테스트 케이스 클래스가 TestCase 의 하위 클래스이며 전달 된 내용의 유효성을 확인하고 기록하는 "assert"문이 포함되어 있다는 것입니다. 보고.
'ProgramingTip' 카테고리의 다른 글
| "JPEG 파일이 아닙니다 : 0x89 0x50으로 시작"오류가 발생하는 이유 (0) | 2020.10.26 |
|---|---|
| Golang 어디에서 문자를 인덱싱하는 방법은 무엇입니까? (0) | 2020.10.26 |
| Uri.Host와 Uri.Authority의 차이점은 무엇입니까? (0) | 2020.10.26 |
| C에서 / dev / random 또는 urandom을 사용하는 방법은 무엇입니까? (0) | 2020.10.26 |
| 특정 테이블 및 항목 Postgres에 대한 데이터베이스 장식 만들기 (0) | 2020.10.26 |