Python Script has no effect on Apache Ant Build - python

I have an ant build file: build.xml, with an existing build target: Rebuild-ALL. that I run from ant eclipse plugin.
The build file contains paths referenced from another file: file.def.
I would like to create a new build target that builds from another path.
I started by doing the following:
Creating a python script that modifies the path in file.def.
I added this script to a target: Change-Paths.
I created a copy of the existing build target: Copy1-Rebuild-ALL
I added my Change-Paths target to the depends of the Copy-Rebuild-ALL.
I also created a second python script to revert the path change in file.def and repeated steps 2 to 4 to have another 2 targets: Revert-Paths and Copy2-Rebuild-ALL.
The problem is that the second build target still takes the path of the first build target even though I can see on my editor that the python script has successfully replaced the paths.
After executing the second target 3 consecutive times it works fine so is there maybe a refresh or a delay I can add to fix this ?
I tried using ant calls instead of depends but still the same issue occurs.
I am still new to ant and build files in general so let me know if there's a better way to do this.
Here is a an example to my build.xml file:
<project name="Build" xmlns:if="ant:if" xmlns:unless="ant:unless" default="REBUILD_ALL" basedir="${ant.file}/../../../..">
<property file="${TOOLS.PATH}/Compiler/file.def" />
<property name="COMPILER" value="${VENDOR.COMPILER}" />
<target name="Change-Paths">
<exec executable="${python.exe}" dir="${basedir}" failonerror="true" inputstring="${TOOLS.PATH}/Compiler/file.def">
<arg line="${SCRIPTS.PATH}/Change_Paths.py" />
</exec>
</target>
<target name="Copy1-Rebuild-ALL" description="Build all files from the project to output executable files" depends="Change-Paths, BuildMakesParallel, LINK_ALL">
</target>
<target name="Revert-Paths">
<exec executable="${python.exe}" dir="${basedir}" failonerror="true" inputstring="${TOOLS.PATH}/Compiler/file.def">
<arg line="${SCRIPTS.PATH}/Revert_Paths.py" />
</exec>
</target>
<target name="Copy2-Rebuild-ALL" description="Build all files from the project to output executable files" depends="Revert-Paths, BuildMakesParallel, LINK_ALL">
</target>
</project>
Also here is an example to file.def:
VENDOR_PATH = c:/VENDOR/toolchains/compiler_name/v1
VENDOR.COMPILER = ${VENDOR_PATH}/bin/compiler_name-gcc.exe

I permanently added the new path in file.def and added a new property in build.xml to hold this path as follows:
VENDOR_PATH_2 = c:/VENDOR/toolchains/compiler_name/v2
VENDOR.COMPILER_2 = ${VENDOR_PATH_2}/bin/compiler_name-gcc.exe
Now the python script will only replace the property name in the macro that compiles files in the build target and it works as expected.

Related

Jenkins reporting from XML file

this is my first post so sorry if there exists answer for a problem I 've got, but I think it is very specific.
My teammates created a very simple testing environment which tests functions in cpp project and it produces report of launched testcases to txt file which looks like this:
0 testcase1 PASS
1 testcase2 PASS
2 testcase2 FAIL
and so on
My task is to prepare an xml file from this txt and put it to Jenkins to generate pretty charts with test run.
Currently I try to parse this txt to JUnitXml file generated by Python lxml library.
Xml file from this txt looks like this:
xml
When I put it to Jenkins it produces me only result of tests which were run, in this case all tests were launched.
What am I missing in my XML file?
Do I need any external library to our test environment which would produce better xml with information about passed, failed testcases?
Cheers.
Here is what you should find in your xml report according to your report :
<testsuite skip="0" failures="1" errors="0" tests="3" name="Name of the tests">
<testcase name="testcase1" classname="This is a name to identify in which class is located the test"/>
<testcase name="testcase2" classname="This is another(or not) name to identify in which class is located the test"/>
<testcase name="testcase3" classname="This is another(or not) name to identify in which class is located the test">
<failure message="Any message of the failing output" type="You can specify the kind of error">
<![CDATA[ "Here you can put a complete stacktrace or
any log message associated with your failure" ]]>
</failure>
</testcase>
</testsuite>
You can find the description (Schema) of the JUnit XML format here

Create a file with maven

I am using maven to generate some protobuf python code but it erases the init.py every time.
I was wondering if maven had a tool to create a blank init.py so that I do not need to create it manually every single time.
(Maybe a copy from a different init.py)
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<checkStaleness>true</checkStaleness>
<staleMillis>10000</staleMillis>
<protocExecutable>${protocLocation}</protocExecutable>
</configuration>
<executions>
<execution>
<id>compile protobuf</id>
<phase>generate-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
<goal>test-compile-python</goal>
</goals>
</execution>
<execution>
<id>compile-python</id>
<phase>initialize</phase>
<goals>
<goal>compile-python</goal>
</goals>
<configuration>
<checkStaleness>false</checkStaleness>
<outputDirectory>${pythonOutputDirectory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
This is the plugin that generates the code and removes the init.py
Note that I set checkstaleness to false. This means it will write protobuf files even if they are not older than a certain time. This is because it was not detecting changes and not writing them out.
EDIT:
The solution was found here:
https://github.com/xolstice/protobuf-maven-plugin/issues/9
Instead of creating a new file. I instead just didn't delete it.
(for anyone else wanting to create a file through maven... keep searching!)
The solution was found here:
https://github.com/xolstice/protobuf-maven-plugin/issues/9
Instead of creating a new file. I instead just didn't delete it.
(for anyone else wanting to create a file through maven... keep searching!)

PySys. About retrieving testcases' execution info for creating a .CSV summary file (v 0.9.2)

I'd would like to create an output file (an .CSV file, as an example)on which store all the outcomes got from a testcase set execution, where I can specify things, besides the outcome itself, such us testcase title, description, execution date/time, testcase duration, etc...
title, description, start datetime, duration (s), outcome
TC#1, My testcase #1, 2016/12/01 11:50:01, 64, BLOCKED
TC#2, My testcase #2, 2016/12/01 11:52:23, 70, PASSED
TC#3, My testcase #3, 2016/12/01 11:53:45, 90, FAILED
...
Has anyone done this before?
Any feedback about it would be appreciated.
Regards
You can run with the -r option to the run task, i.e. pysys.py run -r (to see a list of all options use pysys.py run -h). The -r option allows you to record the output of the tests, based on the writers defined in the pysysproject.xml file. This file that comes with the example projects has the below defined;
<writers>
<writer classname="XMLResultsWriter" module="pysys.writer" file="testsummary-%Y%m%d%H%M%S.xml">
<!--
Set properties on the XML test output writer class. The available properties that
can be set are the stylesheet location, whether to use file URLs in all references
to resources on the local disk, and the directory to write the output file (defaults
to the current working directory). Note that Mozilla Firefox requires the stylesheet
to be located next to the XML file when loading the file, and all references to local
resources must be as file URLs. Internet Explorer and Chrome can load the stylesheet
from any location on the local disk, but cannot load resources when referenced by a
file URL.
<property name="outputDir" value="${rootdir}"/>
<property name="stylesheet" value="./pysys-log.xsl"/>
<property name="useFileURL" value="true"/>
-->
</writer>
<!--
Add in the test results writer if straight text output is required
<writer classname="TextResultsWriter" module="pysys.writer" file="testsummary-%Y%m%d%H%M%S.log">
<property name="outputDir" value="${rootdir}"/>
</writer>
-->
<!--
Add in the JUnit results writer if output in the Apache Ant JUnit XML format is required. Use the
outputDir property to define the output directory for the JUnit test summary files (the writer will
produce one file per test into this output directory). If not specified this defaults to the current
working directory.
<writer classname="JUnitXMLResultsWriter" module="pysys.writer">
<property name="outputDir" value="${rootdir}/target/pysys-reports"/>
</writer>
-->
</writers>
So in the example above your test output would be in xml. You can have multiple writers, i.e. uncomment the TestResultsWriter and you will have both xml and log output summarizing the test results. I don't have a CSV output writer at the moment, though you can write your own one and configure your pysysproject.xml file to point to that (also please put in a feature request if you want me to add to the core package). Have a look at the implementations in the pysys.writer package as examples.

How put baseurl as a parametrs in selenium tests

I have 1 file with selenium tests, with baseURL in it. So now i need to find a way to launch this tests from console with URL as a parametr.
I have one local, developer and production server, so i want to run this tests without hardcode baseURL in it.
Is anyone one have some idea for this?
Waiting for your answers :3
Yes, you can create one Environment file any format would do (.xml, .xlsx, .properties etc).
Then you just mention environment specific details and parse the file. Its better if you use .xml format. In this way you can create node like configuration with parent being the environment name. In this way you can add any number of configuration for different servers.
Something like:-
XML Format:-
<environments>
<environment id="local">
<parameter>
<name>host</name>
<value>LocalURL</value>
</parameter>
</environment>
<environment id="development">
<parameter>
<name>host</name>
<value>DevelopmentURL</value>
</parameter>
</environment>
<environment id="production">
<parameter>
<name>host</name>
<value>ProductionURL</value>
</parameter>
</environment>
</environments>
Properties File Format:-
localUrl = http://local.com
developmentUrl = http://development.com
productionUrl = http://production.com
Any format you can use and write a code to parse it.

specifying python environment variables for ant

Update: Forgot that sysproperty is only for java.
<target name="uploadFile">
<pathconvert property="orchestration.properties" refid="orch.config" />
<exec executable="python" failonerror="true">
<env key="PYTHONPATH" value="${basedir}/lib/python"/>
<arg value="${basedir}/upload.py"/>
<arg value="${basedir}/file.txt"/>
</exec>
</target>
Inside the lib/python directory is a custom python package i want to include when ant runs the exe.
How do I do that? It's not in python, so I can't add it to the path.
Right, I've solved this. Python path works, but I forgot to set new environment. If you don't set a new environment, it automatically reverts back to the old one.
If you ever want to run a python command from ant, but have modules in your basedir, and not the python directory, this is how you do it.
<target name="uploadFile">
<property environment="env"/>
<pathconvert property="orchestration.properties" refid="orch.config" />
<exec executable="python" failonerror="true" **newenvironment="true"**>
<env key="PYTHONPATH" value="${basedir}/lib/python"/>
<arg value="${basedir}/upload.py"/>
<arg value="${basedir}/test1.txt"/>
</exec>
</target>

Categories

Resources