2

我对 Rational Functional Tester (Java) 还很陌生,但我有一大块空白。我有一个处于敏捷开发环境中的应用程序,因此一些屏幕会随着新界面的上线而变化。

出于这个原因,我正在尝试模块化我的测试脚本。例如:我想要一个登录脚本、一个搜索脚本和一个注销脚本。

然后我会将它们拼接在一起(伪代码)

Call Script components.security.Login;
Call Script components.search.Search;
//verification point
Call Script components.security.Logout;

通过将测试脚本分解成离散的块(功能单元),我相信我能够更好地适应变化。如果登录脚本发生变化,我会为应用程序中的每个脚本修复或重新录制一次

然后我会调用该脚本,例如“TestSituation_001”。它需要引用几个不同的数据池。在这种情况下,一个用户数据池(而不是一个超级用户数据池)和一个 TestSituation_001 数据池,或者可能还有其他一些数据池。验证点将使用情境数据池进行检查。

现在,这就是我在理想世界中的做法。目前困扰我的是,我似乎需要做一些完全不同的事情才能让子脚本继承父母。

所以我的问题是:

  1. 为什么子脚本不直接继承调用脚本的数据池?
  2. 我怎样才能让他们这样做?
  3. 我是否对这应该如何工作做出了糟糕的假设?
  4. 如果#3 为真,那么我该如何做得更好?

作为旁注,我不介意破解一些 Java 以使其工作。

谢谢!

4

1 回答 1

2

我解决了我自己的问题。对于那些好奇的人,请查看以下内容:

public abstract class MyTestHelper extends RationalTestScript
{

    protected void useParentDataPool() {
        if(this.getScriptCaller() != null) {
            IDatapool dp = this.getScriptCaller().getDatapool();
            IDatapoolIterator iterator = DatapoolFactory.get().open(dp, "");
            if(dp != null && iterator != null) {
                //if the datapool is not null, substitute it for the current data pool
                this.dpInitialization(dp, iterator);
            }                           
        }
    }

}

这也将使用相同的迭代器。狩猎愉快...

实际上,经过一番思考,我做了一个方法,可以让任何给定的脚本使用 Root 调用脚本的 DataPool。再次,祝需要它的人快乐狩猎......

/*
 * preconditions:  there is a parent caller
 * postconditions: the current script is now using the same datapool / datapool iterator as the root script
 */
protected void useRootDataPool() {
    //if there is no parent, then this wouldn't work so return with no result;
    if(this.getScriptCaller() == null) return;

    //assume that we're at the root node to start
    RationalTestScript root = this;
    while(root.getScriptCaller() != null) {
        root = root.getScriptCaller();
    }

    //if this node is the root node, no need to continue.  the default attached datapool will suffice.
    if(this.equals(root)) return;

    //get the root's data pool (which would be the parent's parent and so on to the topmost)
    IDatapool dp = root.getDatapool();
    if(dp != null) {
        //check to make sure that we're not trying to re-initialize with the same datapool (by name)
        //if we are, then leave
        if(dp.getName().equals(this.getDatapool().getName())) return;

        //this basically says "give me the iterator already associated to this pool"
        IDatapoolIterator iterator = DatapoolFactory.get().open(dp, "");
        //if we have an iterator AND a data pool (from above), then we can initialize
        if(iterator != null) {
            //this method is never supposed to be run, but this works just fine.
            this.dpInitialization(dp, iterator);
            //log information
            logInfo("Using data pool from root script: " + root.getScriptName());
        }
    }
}
于 2010-07-24T08:23:10.923 回答