2012-02-21 6 views
21

우리는 안드로이드 장치가 있고 테스트의 일부로 대상 장치에서 콘솔 테스트 응용 프로그램을 실행해야합니다. 테스트 응용 프로그램에서 오류를 감지하면 -1을 반환합니다.ADB 오류 코드

adb 쉘을 사용하여 대상에서 원격으로 테스트 응용 프로그램을 실행할 수 있지만 리턴 코드를 가져 오는 방법을 찾을 수 없습니다. 자동화 된 테스트 스위트에 이것을 구축 할 수 있도록 필자가 필요합니다.

일부 실패 텍스트에 대해 콘솔 출력을 grepping 할 수는 있지만 다소 지저분합니다. 누구든지 좀 더 우아한 해결책을 알고 있습니까?

+0

동일한 문제가 있습니다. 어떤 adb가 실행 되든 항상 0을 반환합니다. –

+2

[Issue 3254 : \t adb 쉘은 프로그램의 종료 코드를 반환하지 않습니다.] (https://code.google.com/p/android/issues/detail?id=3254) – n611x007

답변

9

다음은 종료 코드를 얻는 방법입니다. adb 쉘 '{여기에 명령하십시오}>/dev/null 2> & 1; echo $? '

def adb(opt) 
    input = "#{adb_command} #{opt[:command]} #{opt[:params]}" 
    puts "Executing #{input}...\n" 
    output = nil 
    exit_code = 0 

    def wait_for(secs) 
    if secs 
     begin 
     Timeout::timeout(secs) { yield } 
     rescue 
     print 'execution expired' 
     end 
    else 
     yield 
    end 
    end 

    wait_for(opt[:timeout]) do 
    case opt[:command] 
    when :install, :push, :uninstall 
     output, exit_code = `#{input}`, $?.to_i 
    when :shell 
     input = "#{adb_command} shell \"#{opt[:params]}; echo \\$?\"" 
     output = `#{input}`.split("\n") 
     exit_code = output.pop.to_i 
     output = output.join("\n") 
    else 
     raise 'Error: param command to adb not defined!' 
    end 
    end 

    return if opt[:ignore_fail] and output =~ /#{opt[:ignore_fail]}/ 
    raise output unless exit_code == 0 
end 
+1

'echo \ $? '를 사용할 필요가 있습니까? – devin

4

당신은 "항상 상태 0으로 종료하는 대신 프로그램의 종료 상태를 전파" "안드로이드 장치에 대한 더 나은 쉘"페이스 북의 fb-adb하는을 사용할 수

루비에서 ADB의 래퍼입니다.