Overhauled output.py to make it read the log file only once
This commit is contained in:
parent
8e79994974
commit
ee511175af
40
appveyor.yml
40
appveyor.yml
|
@ -27,16 +27,6 @@ environment:
|
||||||
PHP_SDK_DIR: c:\projects\php\x64
|
PHP_SDK_DIR: c:\projects\php\x64
|
||||||
PHP_INSTALL_DIR: c:\projects\php\x64\bin
|
PHP_INSTALL_DIR: c:\projects\php\x64\bin
|
||||||
platform: x64
|
platform: x64
|
||||||
- BUILD_PLATFORM: x64
|
|
||||||
TEST_PHP_SQL_SERVER: (local)\SQL2016
|
|
||||||
SQL_INSTANCE: SQL2016
|
|
||||||
PHP_VC: 14
|
|
||||||
PHP_MAJOR_VER: 7.1
|
|
||||||
PHP_MINOR_VER: latest
|
|
||||||
PHP_SDK_DIR: c:\projects\php\x64
|
|
||||||
PHP_INSTALL_DIR: c:\projects\php\x64\bin
|
|
||||||
PHP_ZTS: --disable-zts
|
|
||||||
platform: x64
|
|
||||||
- BUILD_PLATFORM: x86
|
- BUILD_PLATFORM: x86
|
||||||
TEST_PHP_SQL_SERVER: (local)\SQL2014
|
TEST_PHP_SQL_SERVER: (local)\SQL2014
|
||||||
SQL_INSTANCE: SQL2014
|
SQL_INSTANCE: SQL2014
|
||||||
|
@ -56,6 +46,16 @@ environment:
|
||||||
PHP_INSTALL_DIR: c:\projects\php\x86\bin
|
PHP_INSTALL_DIR: c:\projects\php\x86\bin
|
||||||
PHP_ZTS: --disable-zts
|
PHP_ZTS: --disable-zts
|
||||||
platform: x86
|
platform: x86
|
||||||
|
- BUILD_PLATFORM: x64
|
||||||
|
TEST_PHP_SQL_SERVER: (local)\SQL2016
|
||||||
|
SQL_INSTANCE: SQL2016
|
||||||
|
PHP_VC: 14
|
||||||
|
PHP_MAJOR_VER: 7.1
|
||||||
|
PHP_MINOR_VER: latest
|
||||||
|
PHP_SDK_DIR: c:\projects\php\x64
|
||||||
|
PHP_INSTALL_DIR: c:\projects\php\x64\bin
|
||||||
|
PHP_ZTS: --disable-zts
|
||||||
|
platform: x64
|
||||||
|
|
||||||
# PHP_MAJOR_VER is PHP major version to build (7.0, 7.1)
|
# PHP_MAJOR_VER is PHP major version to build (7.0, 7.1)
|
||||||
# PHP_MINOR_VER is PHP point release number (or latest for latest release)
|
# PHP_MINOR_VER is PHP point release number (or latest for latest release)
|
||||||
|
@ -182,14 +182,13 @@ test_script:
|
||||||
OpenCppCoverage.exe --sources $ext_dir\pdo_sqlsrv --sources $ext_dir\sqlsrv --modules *sqlsrv*.dll --export_type=cobertura:.\coverage.xml --cover_children --quiet --continue_after_cpp_exception --optimized_build -- .\php.exe .\run-tests.php -P ${env:APPVEYOR_BUILD_FOLDER}\test\functional\ > ${env:APPVEYOR_BUILD_FOLDER}\test\functional\sqlsrvtests.log 2>&1
|
OpenCppCoverage.exe --sources $ext_dir\pdo_sqlsrv --sources $ext_dir\sqlsrv --modules *sqlsrv*.dll --export_type=cobertura:.\coverage.xml --cover_children --quiet --continue_after_cpp_exception --optimized_build -- .\php.exe .\run-tests.php -P ${env:APPVEYOR_BUILD_FOLDER}\test\functional\ > ${env:APPVEYOR_BUILD_FOLDER}\test\functional\sqlsrvtests.log 2>&1
|
||||||
type ${env:APPVEYOR_BUILD_FOLDER}\test\functional\sqlsrvtests.log;
|
type ${env:APPVEYOR_BUILD_FOLDER}\test\functional\sqlsrvtests.log;
|
||||||
ls *.xml
|
ls *.xml
|
||||||
} Else {
|
|
||||||
"Running phpt tests the regular way..."
|
|
||||||
.\php.exe .\run-tests.php -P ${env:APPVEYOR_BUILD_FOLDER}\test\functional\sqlsrv\*.phpt > ${env:APPVEYOR_BUILD_FOLDER}\test\functional\sqlsrv.log 2>&1
|
|
||||||
type ${env:APPVEYOR_BUILD_FOLDER}\test\functional\sqlsrv.log;
|
|
||||||
.\php.exe .\run-tests.php -P ${env:APPVEYOR_BUILD_FOLDER}\test\functional\pdo_sqlsrv\*.phpt > ${env:APPVEYOR_BUILD_FOLDER}\test\functional\pdo_sqlsrv.log 2>&1
|
|
||||||
type ${env:APPVEYOR_BUILD_FOLDER}\test\functional\pdo_sqlsrv.log;
|
|
||||||
}
|
}
|
||||||
|
- php run-tests.php -p php.exe %APPVEYOR_BUILD_FOLDER%\test\functional\sqlsrv\*.phpt > %APPVEYOR_BUILD_FOLDER%\test\functional\sqlsrv.log 2>&1
|
||||||
|
- type %APPVEYOR_BUILD_FOLDER%\test\functional\sqlsrv.log
|
||||||
|
- php run-tests.php -p php.exe %APPVEYOR_BUILD_FOLDER%\test\functional\pdo_sqlsrv\*.phpt > %APPVEYOR_BUILD_FOLDER%\test\functional\pdo_sqlsrv.log 2>&1
|
||||||
|
- type %APPVEYOR_BUILD_FOLDER%\test\functional\pdo_sqlsrv.log
|
||||||
- python %APPVEYOR_BUILD_FOLDER%\test\functional\setup\cleanup_dbs.py -dbname %SQLSRV_DBNAME%
|
- python %APPVEYOR_BUILD_FOLDER%\test\functional\setup\cleanup_dbs.py -dbname %SQLSRV_DBNAME%
|
||||||
|
- python %APPVEYOR_BUILD_FOLDER%\test\functional\setup\cleanup_dbs.py -dbname %PDOSQLSRV_DBNAME% - python %APPVEYOR_BUILD_FOLDER%\test\functional\setup\cleanup_dbs.py -dbname %SQLSRV_DBNAME%
|
||||||
- python %APPVEYOR_BUILD_FOLDER%\test\functional\setup\cleanup_dbs.py -dbname %PDOSQLSRV_DBNAME%
|
- python %APPVEYOR_BUILD_FOLDER%\test\functional\setup\cleanup_dbs.py -dbname %PDOSQLSRV_DBNAME%
|
||||||
- cd %PHP_INSTALL_DIR%
|
- cd %PHP_INSTALL_DIR%
|
||||||
- ps: $fileExists = Test-Path "coverage.xml"
|
- ps: $fileExists = Test-Path "coverage.xml"
|
||||||
|
@ -213,14 +212,9 @@ after_test:
|
||||||
- ps: $out2files = Get-ChildItem pdo_sqlsrv\*.out
|
- ps: $out2files = Get-ChildItem pdo_sqlsrv\*.out
|
||||||
- ps: foreach($file in $diff2files){ls $file; more $file}
|
- ps: foreach($file in $diff2files){ls $file; more $file}
|
||||||
- ps: foreach($file in $out2files){ls $file; more $file}
|
- ps: foreach($file in $out2files){ls $file; more $file}
|
||||||
#- cd %APPVEYOR_BUILD_FOLDER%\test\functional\
|
- cd %APPVEYOR_BUILD_FOLDER%\test\functional\
|
||||||
# there is only one xml file if running tests with coverage analysis
|
|
||||||
- ps: (new-object net.webclient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\nativeresult1.xml))
|
- ps: (new-object net.webclient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\nativeresult1.xml))
|
||||||
- ps: $result2Exists = Test-Path "nativeresult2.xml"
|
- ps: (new-object net.webclient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\nativeresult2.xml))
|
||||||
- ps: >-
|
|
||||||
If ($result2Exists -eq $true) {
|
|
||||||
(new-object net.webclient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\nativeresult2.xml));
|
|
||||||
}
|
|
||||||
- ps: >-
|
- ps: >-
|
||||||
If ($difffiles -ne $null -Or $diff2files -ne $null) {
|
If ($difffiles -ne $null -Or $diff2files -ne $null) {
|
||||||
$host.SetShouldExit(1);
|
$host.SetShouldExit(1);
|
||||||
|
|
|
@ -2,139 +2,93 @@
|
||||||
#########################################################################################
|
#########################################################################################
|
||||||
#
|
#
|
||||||
# Description:
|
# Description:
|
||||||
# Requirement of python 3.4 to execute this script and required result log file are in the same location
|
# Requirement of python 3.4 to execute this script and required result log file(s)
|
||||||
|
# are in the same location
|
||||||
# Run with command line without options required. Example: py output.py
|
# Run with command line without options required. Example: py output.py
|
||||||
# This script parse output of PHP Native Test
|
# This script parse output of PHP Native Test
|
||||||
#
|
#
|
||||||
#
|
|
||||||
#############################################################################################
|
#############################################################################################
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import stat
|
import stat
|
||||||
import re
|
import re
|
||||||
|
|
||||||
# This module returns either the number of test or the number of failed test
|
# This module appends an entry to the tests list, may include the test title.
|
||||||
# depending on the argument you requested.
|
# Input: search_pattern - pattern to look for in the line of the log file
|
||||||
# Input: var - a single variable containing either "FAIL" or "TOTAL"
|
# line - current line of the log file
|
||||||
# Output: Returns a number of test/s or failed test/s
|
# index - the current index of tests
|
||||||
def returnCount(var):
|
# tests_list - a list of xml entries
|
||||||
with open(os.path.dirname(os.path.realpath(__file__)) + os.sep + logfile) as f:
|
# get_title - boolean flag to get the test title or not
|
||||||
num = 0
|
# Output: None
|
||||||
failnum = 0
|
def get_test_entry(search_pattern, line, index, tests_list, get_title = False):
|
||||||
for line in f:
|
# find the full path to the test name, enclosed by square brackets
|
||||||
if "FAIL" in line or "PASS" in line:
|
result = re.search(search_pattern, line)
|
||||||
if ".phpt" in line:
|
pos1 = result.group(1).find('[')
|
||||||
if "FAIL" in line:
|
pos2 = result.group(1).find(']')
|
||||||
failnum += 1
|
test_line = str(result.group(1))
|
||||||
num += 1
|
|
||||||
if var == 'total':
|
# get the test name by splitting this full path delimited by os.sep
|
||||||
return str(num)
|
substr = test_line[pos1+1:pos2]
|
||||||
|
tmp_array = substr.split(os.sep)
|
||||||
|
pos = len(tmp_array) - 1
|
||||||
|
test_name = tmp_array[pos]
|
||||||
|
|
||||||
|
# only upon a failure do we get the test title
|
||||||
|
if (get_title is True):
|
||||||
|
entry = '\t<testcase name="' + test_name + '-' + index + '">'
|
||||||
|
tests_list.append(entry)
|
||||||
|
test_title = test_line[0:pos1]
|
||||||
|
entry = '\t\t<failure message=" Failed in ' + test_title + '"/>'
|
||||||
|
tests_list.append(entry)
|
||||||
|
tests_list.append('\t</testcase>')
|
||||||
else:
|
else:
|
||||||
return str(failnum)
|
entry = '\t<testcase name="' + test_name + '-' + index + '"/>'
|
||||||
|
tests_list.append(entry)
|
||||||
# This module prints the line that matches the expression.
|
|
||||||
# Input: inputStr - String that matches
|
|
||||||
# file - file name
|
|
||||||
# path - path of the file.
|
|
||||||
# Output: null
|
|
||||||
def readAndPrint(inputStr, file, path):
|
|
||||||
print(path)
|
|
||||||
filn = open(path + os.sep + file).readlines()
|
|
||||||
for lines in filn:
|
|
||||||
if inputStr in lines:
|
|
||||||
print(lines)
|
|
||||||
|
|
||||||
# This module returns the test file name.
|
|
||||||
# Input: line - current line of the log file
|
|
||||||
# Output: Returns the filename.
|
|
||||||
def TestFilename(line):
|
|
||||||
terminateChar = os.sep
|
|
||||||
currentPos = 0
|
|
||||||
firstpos = len(line) * -1
|
|
||||||
print(line)
|
|
||||||
print(firstpos)
|
|
||||||
while True:
|
|
||||||
currentPos = currentPos - 1
|
|
||||||
# if passed the first pos, stop
|
|
||||||
if currentPos < firstpos:
|
|
||||||
break
|
|
||||||
line[currentPos]
|
|
||||||
if line[currentPos] == terminateChar:
|
|
||||||
break
|
|
||||||
file = line[currentPos+1:-1]
|
|
||||||
return file
|
|
||||||
|
|
||||||
def genXML(logfile,number):
|
|
||||||
# Generating the nativeresult.xml file.
|
|
||||||
file = open('nativeresult' + str(number) + '.xml','w')
|
|
||||||
file.write('<?xml version="1.0" encoding="UTF-8" ?>' + os.linesep)
|
|
||||||
file.write('<testsuite tests="' + returnCount('total') + '" failures="' + returnCount('fail') + '" name="Native Tests" >' + os.linesep)
|
|
||||||
file.close()
|
|
||||||
|
|
||||||
# Extract individual test results from the log file and
|
# Extract individual test results from the log file and
|
||||||
# enter it in the nativeresult.xml file.
|
# enter it in the nativeresult.xml file.
|
||||||
|
# Input: logfile - the log file
|
||||||
|
# number - the number for this xml file
|
||||||
|
def gen_XML(logfile, number):
|
||||||
|
print('================================================')
|
||||||
|
print("\n" + os.path.splitext(logfile)[0] + "\n" )
|
||||||
|
|
||||||
|
tests_list = []
|
||||||
with open(os.path.dirname(os.path.realpath(__file__)) + os.sep + logfile) as f:
|
with open(os.path.dirname(os.path.realpath(__file__)) + os.sep + logfile) as f:
|
||||||
num = 1
|
num = 1
|
||||||
failnum = 0
|
failnum = 0
|
||||||
for line in f:
|
for line in f:
|
||||||
file = open('nativeresult' + str(number) + '.xml','a')
|
|
||||||
if "FAIL" in line or "PASS" in line:
|
if "FAIL" in line or "PASS" in line:
|
||||||
if ".phpt" in line:
|
if ".phpt" in line:
|
||||||
|
|
||||||
file.write('\t<testcase name="')
|
|
||||||
if "FAIL" in line:
|
if "FAIL" in line:
|
||||||
failnum += 1
|
failnum += 1
|
||||||
result = re.search('FAIL(.*).', line)
|
get_test_entry('FAIL(.*).', line, str(num), tests_list, True)
|
||||||
file.write(TestFilename(str(result.group(1))) + '-' + str(num) + '">' + os.linesep)
|
|
||||||
stop_pos = result.group(1).find('[')
|
|
||||||
file.write('\t\t<failure message=" Failed in ' + str(result.group(1))[0:stop_pos] + '"/>' + os.linesep)
|
|
||||||
file.write('\t</testcase>' + os.linesep)
|
|
||||||
else:
|
else:
|
||||||
result = re.search('PASS(.*).', line)
|
get_test_entry('PASS(.*).', line, str(num), tests_list)
|
||||||
file.write(TestFilename(str(result.group(1))) + '-' + str(num) + '"/>' + os.linesep)
|
|
||||||
num += 1
|
num += 1
|
||||||
file.close()
|
elif 'Number of tests :' in line or 'Tests skipped ' in line or 'Tests warned ' in line or'Tests failed ' in line or 'Expected fail ' in line or 'Tests passed ' in line:
|
||||||
|
print(line)
|
||||||
|
print('================================================')
|
||||||
|
|
||||||
file = open('nativeresult' + str(number) + '.xml','a')
|
# Generating the nativeresult.xml file.
|
||||||
|
file = open('nativeresult' + str(number) + '.xml', 'w')
|
||||||
|
file.write('<?xml version="1.0" encoding="UTF-8" ?>' + os.linesep)
|
||||||
|
file.write('<testsuite tests="' + str(num - 1) + '" failures="' + str(failnum) + '" name="Native Tests" >' + os.linesep)
|
||||||
|
|
||||||
|
index = 1
|
||||||
|
for test in tests_list:
|
||||||
|
file.write(test + os.linesep)
|
||||||
file.write('</testsuite>' + os.linesep)
|
file.write('</testsuite>' + os.linesep)
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
def run():
|
# ----------------------- Main Function -----------------------
|
||||||
num = 1
|
|
||||||
for f in os.listdir(os.path.dirname(os.path.realpath(__file__))):
|
|
||||||
if f.endswith("log"):
|
|
||||||
print('================================================')
|
|
||||||
print(os.path.splitext(f)[0])
|
|
||||||
readAndPrint('Number of tests :', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Tests skipped ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Tests warned ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Tests failed ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Expected fail ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Tests passed ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
print('================================================')
|
|
||||||
logfile = f
|
|
||||||
genXML(logfile,num)
|
|
||||||
num = num + 1
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------- Main Function ---------------------------------------------------
|
|
||||||
|
|
||||||
# Display results on screen from result log file.
|
# Display results on screen from result log file.
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
num = 1
|
num = 1
|
||||||
for f in os.listdir(os.path.dirname(os.path.realpath(__file__))):
|
for f in os.listdir(os.path.dirname(os.path.realpath(__file__))):
|
||||||
if f.endswith("log"):
|
if f.endswith("log"):
|
||||||
print('================================================')
|
|
||||||
print("\n" + os.path.splitext(f)[0] + "\n")
|
|
||||||
readAndPrint('Number of tests :', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Tests skipped ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Tests warned ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Tests failed ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Expected fail ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
readAndPrint('Tests passed ', f, os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
print('================================================')
|
|
||||||
logfile = f
|
logfile = f
|
||||||
genXML(logfile,num)
|
gen_XML(logfile, num)
|
||||||
num = num + 1
|
num = num + 1
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue