using row data for column headers
11g has the pivot construct, which appears to meet your needs:

with pivot_data as (
select buildnumber, testname, status
  from testresults)
select * from pivot_data
 pivot (min(status)
        for buildnumber
        in ('1' as build_1, '2' as build_2, '3' as build_3)
        )
order by 1;


Note the min(status), the pivot requires an aggregate function, so we're working around that requirement.

TESTNAME    BUILD_1 BUILD_2 BUILD_3
testname1   pass    fail    fail
testname2   fail    fail    pass
testname3   warning fail    fail