2008-09-24 7 views
6

Tôi đang cố gắng xác định tác vụ phát ra (sử dụng echo) một thông báo khi mục tiêu hoàn thành thực thi, bất kể mục tiêu đó có thành công hay không. Cụ thể, mục tiêu thực hiện một nhiệm vụ để chạy một số xét nghiệm đơn vị, và tôi muốn phát ra một thông báo chỉ nơi các kết quả có sẵn:Vô điều kiện thực hiện một nhiệm vụ trong kiến?

<target name="mytarget"> 
    <testng outputDir="${results}" ...> 
    ... 
    </testng> 
    <echo>Tests complete. Results available in ${results}</echo> 
</target> 

Thật không may, nếu các cuộc thử nghiệm thất bại, nhiệm vụ thất bại và thực hiện hủy bỏ. Vì vậy, thông điệp chỉ là đầu ra nếu các bài kiểm tra vượt qua - ngược lại với những gì tôi muốn. Tôi biết tôi có thể đặt nhiệm vụ trước nhiệm vụ, nhưng điều này sẽ giúp người dùng dễ dàng bỏ lỡ thông báo này. Là những gì tôi đang cố gắng để làm có thể?

Cập nhật: Hóa ra tôi câm. Tôi đã haltOnFailure = "true" trong nhiệm vụ <testng> của tôi, giải thích hành vi mà tôi đã nhìn thấy. Bây giờ vấn đề là thiết lập này để sai gây ra kiến ​​xây dựng tổng thể để thành công ngay cả khi kiểm tra thất bại, mà không phải là những gì tôi muốn. Câu trả lời dưới đây sử dụng nhiệm vụ có vẻ như nó có thể là những gì tôi muốn ..

+0

Thuộc tính haltonfailure của bạn được đặt thành? – toolkit

Trả lời

4

Giải pháp cho vấn đề của bạn là sử dụng failureProperty kết hợp với haltOnFailure tài sản của nhiệm vụ testng như thế này:

<target name="mytarget"> 
    <testng outputDir="${results}" failureProperty="tests.failed" haltOnFailure="false" ...> 
    ... 
    </testng> 
    <echo>Tests complete. Results available in ${results}</echo> 
</target> 

Sau đó, ở nơi khác khi bạn muốn xây dựng để thất bại bạn thêm mã kiến ​​như thế này :

<target name="doSomethingIfTestsWereSuccessful" unless="tests.failed"> 
    ... 
</target> 

<target name="doSomethingIfTestsFailed" if="tests.failed"> 
    ... 
    <fail message="Tests Failed" /> 
</target> 

Sau đó, bạn có thể gọi doSomethingIfTestsFailed nơi bạn muốn kiến ​​xây dựng không thành công.

+0

Tôi cần thêm phụ thuộc vào doSomethingIfTestsFailed, nhưng điều này đã hiệu quả. Cảm ơn! –

5

Theo Ant docs, có hai đặc tính điều khiển cho dù quá trình xây dựng được dừng lại hay không nếu nhiệm vụ thất bại testng:

haltonfailure - Dừng quá trình xây dựng nếu xảy ra lỗi trong khi chạy thử nghiệm . Mặc định là sai.

haltonskipped - Dừng quá trình xây dựng nếu có ít nhất trên thử nghiệm bị bỏ qua. Mặc định là sai.

Tôi không thể nói từ đoạn trích nếu bạn đang đặt thuộc tính này hay không. Có thể đáng để đặt haltonfailure thành false nếu nó hiện được đặt thành true.

Ngoài ra, giả sử bạn đang sử dụng <exec> chức năng trong Ant, có tính chất tương tự để kiểm soát những gì sẽ xảy ra nếu lệnh thực hiện thất bại:

failonerror - Dừng buildprocess nếu thoát lệnh với mã trả lại lỗi báo hiệu. Mặc định là sai.

failifexecutionfails - Dừng bản dựng nếu chúng tôi không thể khởi động chương trình. Mặc định là đúng.

không thể nói căn cứ vào đoạn mã một phần trong bài viết của bạn, nhưng tôi đoán là nguyên nhân chủ yếu là failonerror hoặc haltonfailure được thiết lập là true.

5

Bạn có thể sử dụng một khối try-catch như vậy:

<target name="myTarget"> 
    <trycatch property="foo" reference="bar"> 
     <try> 
      <testing outputdir="${results}" ...> 
       ... 
      </testing> 
     </try> 

     <catch> 
      <echo>Test failed</echo> 
     </catch> 

     <finally> 
      <echo>Tests complete. Results available in ${results}</echo> 
     </finally> 
    </trycatch> 
</target> 
0

Mặc dù bạn đang hiển thị một nhiệm vụ giả gọi là "testng" trong ví dụ của bạn tôi đoán bạn đang sử dụng các mục tiêu JUnit.

Trong trường hợp này, thật lạ khi bạn nhìn thấy các kết quả này vì mục tiêu junit theo mặc định KHÔNG hủy bỏ việc thi hành khi lỗi thử nghiệm.

Có một cách để thực sự nói kiến ​​để ngăn chặn việc xây dựng trên một sự thất bại junit hoặc lỗi bằng cách sử dụng các thuộc tính tạm dừng, ví dụ như. haltonfailure:

<target name="junit" depends="junitcompile"> 
    <junit printsummary="withOutAndErr" fork="yes" haltonfailure="yes"> 

Tuy nhiên, cả haltonfailurehaltonerror là theo mặc định thiết lập để tắt. Tôi cho rằng bạn có thể kiểm tra tệp xây dựng của mình để xem liệu một trong các cờ này đã được đặt chưa. Họ thậm chí có thể được thiết lập trên toàn cầu, vì vậy một điều bạn có thể thử là đặt rõ ràng là "không" trên công việc của bạn để đảm bảo nó được ghi đè trong trường hợp nó được đặt trong phạm vi toàn cục.

http://ant.apache.org/manual/Tasks/junit.html

+1

Thực ra testng không phải là mục tiêu giả. Tôi đang sử dụng TestNG thay vì JUnit, nhưng ý tưởng là như nhau. –

0

Bạn có thể nĩa nhiệm vụ testng không? Nếu có, thì bạn có thể muốn sử dụng tính năng đó để nhiệm vụ testng sẽ chạy trên một JVM khác.