웹 양식 사이트를 단위 테스트하려면 어떻게합니까?


26

웹 양식 사이트를 단위 테스트하려면 어떻게합니까? 그것은 많은 것이 상태와 사용자 입력에 달려 있기 때문에 실현 가능하지 않을 것 같습니다.

그것이 가능하지 않은 경우 유효한 자동 대안이 있습니까?


2
자동화 된 사용자 인터페이스 테스트를 원한다면 Selenium과 같은 것이 필요합니다. 그러나 자동 단위 테스트 를 원한다면 셀레늄이 필요하지 않습니다. 올바른 패턴이 필요합니다. 내 대답을 참조하십시오.
Matthew Rodatus

답변:


22

그래 넌 할수있어. 당신은 당신의 우려를 잘 분리하기 위해 조심해야합니다. 즉, 코드 숨김에서 모든 논리를 제거하여 다른 클래스에 넣어야합니다.

이를 수행하는 일반적인 두 가지 방법이 있습니다.

간단한 방법은 "시스템에서 어떤 정보를 제공합니까? 페이지에서 어떤 정보를 채워야합니까?"라는 관점에서 모든 이벤트 핸들러를 다시 생각하는 것입니다. 그런 다음 해당 변환을 수행하는 서비스 클래스를 제공하십시오.

이 경우 서비스 계층은 프레젠테이션 계층의 특성에 대해 거의 알아야합니다. 여전히 서비스에서 반환 된 데이터를 가져와 코드 숨김에 WebForm의 올바른 구성 요소를 채워야하며 이는 테스트되지 않은 상태로 유지됩니다 (적어도 단위 테스트로 통합 테스트를 수행 할 수 있음). 그러나 이것은 코드가 잘못되는 경우는 거의 없으며 논리에서 실패 할 가능성이 훨씬 큽니다.

보다 복잡하지만 효과적인 방법은 Model View Presenter 패턴 을 사용하는 것 입니다 . 우리가 그것을 시도했을 때, 우리는 Presenters가 프레임 워크에 빠르게 연결되었고 MVP를 더 많이 개발할수록 MVP가 실제로 MVC가되고 싶었지만 그럴 수 없다는 것이 더욱 분명해졌습니다.

즉, 다른 사람들은이 작업을 매우 성공적으로 수행했습니다 . 무거운 물건을 제거하는 데 사용할 수 있는 webformsmvp 프레임 워크 도 있으므로 마일리지가 다를 수 있습니다.


1
@jmoreno : 멋진 캐치! WebForms를 잊어 버렸으며 MVP는 지난 5 년 동안도 존재합니다.
pdr

16

분명히 전체 웹 양식 페이지는 하나의 단위가 아니므로 단위 테스트를 수행 할 수 없습니다. 그러나 자동화 된 테스트를 위해 수행 할 수있는 작업이 있습니다.

  • 페이지의 개별 구성 요소 단위 테스트 (실제 논리를 수행하는 모든 메소드)
  • 페이지에서 사용하는 단위 테스트 구성 요소 (사용자 지정 컨트롤, 기본 비즈니스 논리 등)
  • 자동화 된 기능 테스트 (브라우저를 원격 제어하거나 cURL과 같은 것을 통해 HTTP 요청을 전송)
  • 자동 침투 테스트 (가능한 주입 지점을 찾고 페이지에서 무해하지만 탐지 가능한 주입 공격을 자동으로 실행하는 도구가 있습니다)
  • 부하 테스트
  • 유용성 및 하우스 스타일의 글 머리 기호 목록과 비교하여 레이아웃 확인

-1 죄송하지만로드 테스트, 침투 테스트 및 레이아웃 검사는 단위 테스트와 관련이 없습니다.
Tom Squires

2
@TomSquires : 물론 그렇지 않습니다. 제 답변을주의 깊게 읽으면 내가 그 말을 한 적이 없다는 것을 알게 될 것입니다. 그러나 문제는 일반적으로 단위 테스트와 자동 테스트의 개념을 혼동하는 것 같습니다. 그래서 웹 양식에 던질 수있는 다양한 의미있는 자동 테스트를 나열했습니다.
tdammers

웹 페이지 테스트는 엄격한 정의에 의한 단위 테스트보다 통합 테스트의 형태 일 가능성이 높지만, 가능한 모든 것을 자동화하는 것이 좋습니다
jk.

6
@TomSquires : 완전히 정당화되지 않은 공감. 귀하의 질문은 전체 사이트를 테스트하는 것으로 시작되며, 단위 테스트와는 아무런 관련이 없습니다. Tdammers는 전체 및 부품을 테스트하는 다양한 방법을 식별하고 단위 테스트가 적합한 위치를 식별했습니다. +1
azheglov

3
충분합니다. 다시 가져가
Tom Squires

9

질문의 "단위"부분이 누락되어 죄송합니다 ...

SeleniumHQ 는 프런트 엔드 테스트를위한 친구입니다. 블랙 박스 테스트와 같은 단위 테스트가 아닙니다. 여전히 유효한 테스트 사례를 고려해야합니다 ...


1
+1 "답글 게시"를 똑같이 누르면서 답이 나왔습니다.
yannis

2
또한 op가 단위 테스트를 요구하고 있기 때문에 실제로 질문에 대한 기능기능 (ity) testing 이며 사용자 입력 요소를 테스트 할 때 더 적절하고 합리적인 것입니다.
yannis

+1 왜냐하면 나는 그것을 사용하는 의미를 유지하지만 결코 그것에 얽매이지 않았다. 누구나 그것을 사용 했습니까, 훌륭하고 구현할 가치가 있습니까?
NimChimpsky

6
셀레늄은 환상적인 도구이지만 단위 테스트와는 전혀 관련이 없습니다.
pdr

사실, 질문 에서이 정보를 건너 뛴 것 같습니다 : /
WarrenFaith

6

경험에서 말하기 : 제대로 된 경우에만. "올바른"이란 최소한의 코드 숨김과 위에서 언급 한 Model-View-Presenter와 같은 웹 양식을 "멍청한"것으로 만드는 것을 의미합니다. 이것은 일반적으로 브라운 필드 응용 프로그램을 염두에두고 설계되지 않았으므로 사용하기 위해 페이지를 리팩터링 / 다시 작성하려는 거의 노력이 필요하기 때문에 브라운 필드 응용 프로그램에서는 매우 어려운 것으로 판명 되었습니다.


1

watin

단위 웹 테스트는 회귀 버그 또는 새로운 프로젝트에 대한 일반적인 아이디어를 제공하더라도 매우 유용합니다.

상태와 관련하여 UI가 아닌 테스트와 마찬가지로 단위 테스트를 작성합니다. 테스트 시작시 데이터베이스를 지우고 시작 상태 이외의 것을 포함하지 않도록 데이터베이스를 다시 빌드합니다. 그런 다음 각 단위 테스트는 단일 페이지 또는 일반적으로 페이지의 개별 작업을 캡슐화합니다.

http://watin.org/ 는 또 다른 웹 테스트 도구이지만 C # /. NET 용입니다. 테스트를 단위 테스트로 작성하십시오.

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

현재 IE 기반이지만 Firefox 및 Chrome에 대한 실험적인 지원이 있습니다. Javascript 상호 작용을 포함하여 수동 테스트에서 수행하는 모든 작업을 자동화 할 수 있습니다.


현재 WatiN 사이트를 방문하면 WatiN이 죽었을 가능성이 있습니다. 문서가 최신이 아닌 희박하고 비디오가 재생되지 않습니다. 나는 불평 하지 않습니다 -오픈 소스 자발적 도구에 대해 큰 감사를 표합니다-이 의견은 저와 같은 다른 사람들을 돕습니다. 대답은 괜찮습니다. 시작하기 위해서는 자율 실습이 필요할 수 있습니다.
qxotk

1
WatiN 방식을 생각하는 사람을위한 추가 도움, 정체 상태 + 현재 위치를 확인하십시오 : stackoverflow.com/questions/118531/…
qxotk

0

단순히 웹 요청이 유선 (또는 TCP 스택)을 통해 발생하기 때문에 웹 사이트를 실제로 단위 테스트 할 수는 없습니다. 따라서 테스트는 "단위 테스트"의 정의에 맞지 않으며 엔드-투-엔드 테스트 일 것입니다.

이러한 종류의 테스트에는 웹 브라우저를 실행하는 Selenium과 같은 제품군을 사용할 수 있습니다. 경고의 말 : 일반적으로 이러한 종류의 테스트는 움직이는 부분이 많기 때문에 매우 어렵고 예측할 수 없습니다!

더 흥미롭게도 웹 양식을 테스트 해야하는 이유가 조금 걱정 됩니다. 코드 뒤에 너무 많은 논리를 넣지 않았고 우연히 빈약 한 비즈니스 논리를 가지고 있습니까?


-1

재스민 속

지난 5 년 동안 Jasmine은 프론트 엔드 장치 테스트를위한 핵심 도구로 부상했습니다. 종종 Node 및 npm을 사용한 자동 빌드 테스트에 통합됩니다.

https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework) 당 :

Jasmine은 JavaScript를위한 오픈 소스 테스트 프레임 워크입니다. [2] JavaScript 지원 플랫폼에서 실행하고 응용 프로그램이나 IDE에 침입하지 않고 읽기 쉬운 구문을 사용하는 것을 목표로합니다. ScrewUnit, JSSpec, JSpec 및 RSpec과 같은 다른 단위 테스트 프레임 워크의 영향을 많이받습니다. [3]

Javascript에 대한 모든 언급에도 불구하고 일반 웹 양식의 단위 테스트에도 사용할 수 있습니다.


자바 스크립트는 웹 양식에서 UI 업데이트는 없습니다 기본 방법을 사용하는 동안
톰 종복

참된. 그러나 대안은 ...? 그렇기 때문에 Jasmine은 그 목적을 위해 의도되지 않았지만 잘 작동합니다. 또한 구문은 Ruby 프로그래머가 좋아하는 RSpec과 거의 동일합니다.
Michael Durrant

-2

ASP.NET

ASP.NET 사이트를 개발할 때 다음에서 장치 테스트를 실행할 수있었습니다.

  • 도메인
  • BL 컨트롤러 / 발표자
  • Web Forms 페이지의 코드 숨김

아키텍처에 따라이 모든 것을 TDD 할 수 있습니다. 단위 테스트를 할 수없는 유일한 것은 마크 업 파일의 레이아웃입니다.


3
이 대답은 "어떻게"라는 질문에 "그렇습니다"라고 말합니다. 정확히 도움이되지는 않습니다.
RubberDuck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.