3

I've been beating my brains out on this issue for the last week and have nowhere else to turn. Currently, whenever I run tests in Instruments the pass/fail logging feature almost always reports:

Issue: Script ended without explicting closing this test

NOTE -- yes, the spelling error is correct

But my logging method is correct. And sometimes when I make a change to the test, perhaps just adding an extra whitespace or maybe a comment, then save and run again, the pass/fail functionality will actually work ONCE!

But then if the same code is immediately run again without any changes, the Issue: Script ended without explicting closing this test issue occurs again.

It's maddening!

Here's an abridged example of my test code:

var target = UIATarget.localTarget();
var app = UIATarget.localTarget().frontMostApp();

var testName = "LoginCreateEntry";

//Start test logging
UIALogger.logStart(testName);

//**Do UI automation stuff here generated by Instruments/record**
//The automation creates a list entry in my application
//The flow goes, run the automation that creates the entry, then verify that the entry
//got created as expected and is visible to the user in the iPhone interface.

 var window = app.mainWindow();
 var tableView = window.tableViews()[0];
 var tableGroup = tableView.groups()[0];
 var entryName = "My Dogs!";
 var myEntry = tableView.cells()[0].name(); 

//Do a bunch of UI automation here to create my entry, which results in the entry
//appearing in the mainWindow with the label: My Dogs!

//Get the value held in myEntry to print to the log so that I know
//the variable has a value in it to evaluate
UIALogger.logMessage("My Story Title: " + myEntry);

//If myEntry evaluates to true, then call this test a pass.

if (myEntry === entryName) {    
UIALogger.logMessage("My entry was created!");

    //Mark the test as a PASS
    UIALogger.logPass(testName);
}
else {

    UIALogger.logMessage("My entry was not created!");

    //Mark the test as a FAIL
    UIALogger.logFail(testName); 
    }

//End test

As stated previously, when this code is run I get:

Issue: Script ended without explicating closing this test

But If I add a second logMessage() method, or make any changes to the script--even adding a comment, and save these changes and then run again--there's an 80% chance that pass/fail will work for a single run. But if the code is then immediately run again with no changes, then the enraging "Issue: Script ended..." behavior occurs again.

I'm at wits end here. Any help or feedback would be most appreciated!

Also, this same problem has been experienced by others as reported here: Instruments Automation Tool: Script Ended Without Explicitly Closing This Test

---------------------UPDATE----------------------------
I've now duplicated the issue on a separate MacBook Pro running Xcode 4.6. I've also made various efforts to intentionally fail my tests--just to get a reaction, but still get the Issue: Script ended without expliciting closing this test log message, which tells me the conditionals might not even be getting read. Yet, again, if I make any minor changes to the script and then save these changes and run again, there's a good chance that the pass/fail function will work for a single run, then start having the "Issue: Script ended..." behavior again on the very next run even with no script changes.

---------------------UPDATE x 2----------------------------
It's the IF statement that appears to be non firing and I can't even use a breakpoint to verify this for sure. But I just ran a simple test like this:

UIALogger.logStart();

if (5 < 10) 
{        
        //Mark the test as a PASS
        UIALogger.logPass();    
}
    else 
{
        //Mark the test as a FAIL
        UIALogger.logFail();         
}

And still got Issue: Script ended without explicating closing this test

---------------------UPDATE x 3----------------------------

So, I just created a whole new separate script in Instruments with ONLY the code below, and now pass/fail always works no matter how I change the relative values in the IF statement. Wow, this is getting stranger by the moment.

var target = UIATarget.localTarget();

UIALogger.logStart();

if (5 > 10) 
{        
        //Mark the test as a PASS
        UIALogger.logPass();    
}
    else 
{
        //Mark the test as a FAIL
        UIALogger.logFail();         
}
Community
  • 1
  • 1
Wulf
  • 379
  • 1
  • 6
  • 16

2 Answers2

1

OK, the problem is real and likely affects only Xcode 4.6. The issue was duplicated on multiple machines and with multiple trace scripts. Here's the solution:

Add a wait in your if statement like so:

UIALogger.logStart( testName );

//Do automation stuff here

        if (5 < 10) {
        UIALogger.logMessage("We passed!");
            //Wait a moment
        target.delay(1);
            UIALogger.logPass( testName );
        } else {
        UIALogger.logMessage("We Failed!");
            UIALogger.logFail( testName );
            UIALogger.logFail( testName );
        }

Also, and this may sound idiotic--but it's what works for me, note that there is NO delay in the logFail() portion of your IF statement, but there are two logFail() statements (sometimes 3 logFail() statements are needed). If you use the delay in the fail portion of the IF statement, you will get the ISSUE message instead of a clean FAIL message. And no, I'm not joking. And yes, this is silly.

Wulf
  • 379
  • 1
  • 6
  • 16
0

I tried Wulf's answer and several others, but none were always working, but I found out that adding delay AFTER logFail/logPass will pretty much always result in properly closing the test.

Like this:

UIALogger.logPass(testName);
target.delay(1);

Same for fail. Note that it also won't give you several fails in logs:

UIALogger.logFail(testName);
target.delay(1);

I know the topic is pretty old, but I hope this helps someone.

johnyu
  • 2,152
  • 1
  • 15
  • 33