We are building a new experience for our SmartBear Community.
This site is now read-only. You can still browse and search as usual. Learn More
This site is now read-only. You can still browse and search as usual. Learn More
My goal is to pipe output from command line GNU DIFF to clipboard and then log it. My problem is that Sys.Clipboard is holding the last thing I copied to clipboard BEFORE running the script. I have verified that the script is running fine when I do it by hand.
I have a TC12 script function that calls the GNU DIFF and then a driver function to make testing more convenient...
Function that does the GNU DIFF and should copy results to clipboard and then log whatever is in clipboard:
def diffTwoFilesToLog(file1, file2): diffCmd = "\"C:\\Program Files (x86)\\GnuWin32\\bin\\diff.exe\" " + file1 + " " + file2 + " | clip" WshShell.Run(diffCmd) Log.Warning(Sys.Clipboard)
Test driver for that function:
def diffTwoFilesToLogDriver(): f1 = "C:\\imports\\exportCompare\\publishtest.txt" f2 = "C:\\imports\\exportCompare\\slush\\actualOCount.txt" diffTwoFilesToLog(f1, f2)
If I put a breakpoint on Log.Warning(Sys.Clipboard) in diffTwoFilesToLog, let it execute, go to "Locals" I see that 'diffCmd' has this value:
"C:\Program Files (x86)\GnuWin32\bin\diff.exe" C:\imports\exportCompare\publishtest.txt C:\imports\exportCompare\slush\actualOCount.txt | clip
^If I copy that exact line into my command line "dos box" and execute by hand it copies the DIFF to clipboard (desired result):
33d32
< ROC Protocol 0 {F0F0ED91-DD1E-4DE3-82AE-9B7AC011D670}My problem is that Sys.Clipboard is instead holding the last thing I copied to clipboard BEFORE running the TC12 script.
Thoughts on why that is the case?
https://msdn.microsoft.com/en-us/library/d5fk67ky(v=vs.84).aspx by default does not wait for the command to complete, so Log.Warning(Sys.Clipboard) happens before diff completes. To make it wait you need to specify True as the third parameter of the Run method.
WshShell.Run(diffCmd, 0, True)
Alternatively, you can use Python's built-in https://docs.python.org/3/library/subprocess.html#subprocess.check_output so you won't have to deal with the clipboard:
import subprocess
def diffTwoFilesToLog(file1, file2):
output = subprocess.check_output(["C:\\Program Files (x86)\\GnuWin32\\bin\\diff.exe", file1, file2])
output = output.decode() # convert byte-string to string
Log.Warning(output)
https://msdn.microsoft.com/en-us/library/d5fk67ky(v=vs.84).aspx by default does not wait for the command to complete, so Log.Warning(Sys.Clipboard) happens before diff completes. To make it wait you need to specify True as the third parameter of the Run method.
WshShell.Run(diffCmd, 0, True)
Alternatively, you can use Python's built-in https://docs.python.org/3/library/subprocess.html#subprocess.check_output so you won't have to deal with the clipboard:
import subprocess
def diffTwoFilesToLog(file1, file2):
output = subprocess.check_output(["C:\\Program Files (x86)\\GnuWin32\\bin\\diff.exe", file1, file2])
output = output.decode() # convert byte-string to string
Log.Warning(output)
HKosova John_LairdThanks for sharing nice info.
OK so I worked around the problem by not using the clipboard and getting what I needed via standard output. I changed WshShell.Run to WShShell.Exec, then got the standard output from the object that WshShel.Exec returns.
def diffTwoFilesToLog(file1, file2): diffCmd = "\"C:\\Program Files (x86)\\GnuWin32\\bin\\diff.exe\" " + file1 + " " + file2 execResult = WshShell.Exec(diffCmd) sout = execResult.StdOut Log.Warning(sout.ReadAll())
I'm still a bit confused why Sys.Clipboard was not working before with the previous example though.
Hi,
I'm interested about how you deal with your diff utility
Personnaly I create a batch file which launches WinMerge with the appropriate left and right file preloaded.
If the test reveals a difference, in my mail I write in html a link which launches the batch file.
m_essaid wrote:Hi,
I'm interested about how you deal with your diff utility
Personnaly I create a batch file which launches WinMerge with the appropriate left and right file preloaded.
If the test reveals a difference, in my mail I write in html a link which launches the batch file.
The purpose of the DIFF above was to verify whether or not the software product I am testing is configured how I think it is before the test gets run (that is in an assumed state). WinMerge is a much better tool if you need a human to look at the data, in this case I do not, so I use GNU DIFF (Linux ported to Windows) which I think works better when a human does not need to intervene. See here:
https://www.gnu.org/software/diffutils/manual/diffutils.html#Invoking-diff
The software configuration is determined by how objects are setup in the product I am testing...so we have a dialog box that gives the user a count of how many types of each object there is. I push that object count text to file, then DIFF that against a 'test control' file and that tells me before the meat of the test gets run that the configuration is not as expected (because it can impact test results). Its one of the checks I have TC/TE run before I allow the test to continue in order to save time on the server (this particular test requires an hour to run).
In another part of the same test I am recursively DIFF-ing two paired folders with a large number of files (both text and binary) in a complex directory tree. So I use these arguments instead for that:
def diffSummaryTwoFolderOutputs(output1, output2, binary):
diffCmd = "\"C:\\Program Files (x86)\\GnuWin32\\bin\\diff.exe\" " + output1 + " " + output2 + " --brief --recursive"
if binary is True:
diffCmd += " --binary"
execResult = WshShell.Exec(diffCmd)
sout = execResult.StdOut.ReadAll()
return sout^Then I put that result in a 'summary report' text file. If there are any differences found, everything gets neatly packaged into a ZIP file (>300MB of data) for later analysis by me or another human to see if the differences found are desirable or not, or just noise. WinMerge, or some other, more human friendly tool is later used for analysis.
ok thank you, it's intereresting