背景:我的目标是编写一个运行自包含的TestNG-Selenium系统(没有字符串到maven或ant插件;只是java).它必须允许测试用例接受包括浏览器和域URL的参数.当TestRunner实例化这些测试用例时,浏览器和域用于获取Selenium对象来执行它的测试.
问题:在尝试获取Selenium对象(在@BeforeTest中)之前,每个套件只有一个测试类成功获取域参数(在@BeforeSuite方法中).没有接收域的测试类具有空的selenium对象b/c它不能被实例化.
代码:XmlClasses每个都包含在他们自己的XmlTest中,并且所有三个都在一个XmlSuite中.该套件包含TestClass1,TestClass2和TestClass3的顺序.测试类本身是2层抽象基类的子类,包括初始化注入变量并随后获取Selenium实例的功能.这样做的目的是使用尽可能少的重复代码测试一个或多个应用程序(在多个域上)(即:Selenium实例化在根基类中,因为它对所有测试都是通用的).有关详细信息,请参阅以下方法
// Top-most custom base class
abstract public class WebAppTestBase extends SeleneseTestBase
{
private static Logger logger = Logger.getLogger(WebAppTestBase.class);
protected static Selenium selenium = null;
protected String domain = null;
protected String browser = null;
@BeforeTest(alwaysRun = true)
@Parameters({ "selenium.browser" })
public void setupTest(String browser)
{
this.browser = browser;
logger.debug(this.getClass().getName()
+ " acquiring Selenium instance ('" + this.browser + " : " + domain + "').");
selenium = new DefaultSelenium("localhost", 4444, browser, domain);
selenium.start();
}
}
// Second …Run Code Online (Sandbox Code Playgroud) 我试图用一个具有不同返回类型的不同方法替换一个方法,但似乎我能成功完成它的唯一方法是让所有方法的源代码都有一个被替换方法的调用站点.我甚至尝试使用调用方法来调用新的替换方法,但是我得到了一个VerifyError(操作数堆栈上的错误类型).在重建依赖方法时,有没有办法只使用字节码而不依赖于源代码?
功能示例(源代码依赖)
public class OverrideTest {
final ClassPool POOL = ClassPool.getDefault();
class Foo {
public Integer getFoo() { return new Integer(1); }
public String doA() { return getFoo().toString(); }
}
class FooReplacement {
public String getFoo() { return "A"; }
}
@Test
public void d() throws Throwable {
CtClass srcClass = POOL.getCtClass(Foo.class.getName());
CtClass extClass = POOL.getCtClass(FooReplacement.class.getName());
CtClass d = POOL.makeClass("Derp");
CtClass STRING = POOL.get("java.lang.String");
CtClass INT = POOL.get("java.lang.Integer");
{
CtMethod doA1 = srcClass.getMethod("doA", Descriptor.ofMethod(STRING, new CtClass[0]));
CtMethod getFoo1 = srcClass.getMethod("getFoo", …Run Code Online (Sandbox Code Playgroud) 我正在考虑一个程序的两个选项.C++与Boost异步IO或Java与异步NIO.我知道只要系统具有java运行时,Java就是可移植的.我更喜欢将C++与Boost一起使用,但我不确定我编写的程序是否可以移植到不同的Windows机器上并且仍在运行.我需要做些什么来确保程序在运行时具有所有必需的依赖项?我计划只使用windows.h,C++ 2003标准和Boost库.
我的项目包括以下文件:
./index.html
./js/main.js
./js/vendor/require.js
./js/viewmodel/vm.js
Run Code Online (Sandbox Code Playgroud)
将index.html具有以下相关片段:
<script data-main="js/main.js" src="js/vendor/require.js"></script>
<script type="text/javascript">
require(['viewmodel/vm', 'ko'],
function(viewmodel, ko) {
ko.applyBindings(viewmodel);
}
);
</script>
Run Code Online (Sandbox Code Playgroud)
该js/main.js文件如下:
var root = this;
define('jquery', ['http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.js'], function () { return root.$; });
define('ko', ['http://ajax.aspnetcdn.com/ajax/knockout/knockout-2.1.0.js'], function (ko) { return ko; });
Run Code Online (Sandbox Code Playgroud)
该js/viewmodel/vm.js文件...
define(['jquery', 'ko'],
function($, ko) {
return {
subject: 'world',
greeting: 'hello'
}
}
);
Run Code Online (Sandbox Code Playgroud)
当您打开浏览器到index.html时,浏览器会尝试加载一个名为js/ko.js而不是使用中定义的模块的文件main.js.似乎data-main属性指向的js文件不能保证在依赖项解析之前运行.这对我来说似乎不正确,因为data-main js文件的一个目的是定义require配置(即path,shim等).我使用的是必需的v2.1.2.
如果我将我的main.js文件的内容复制到脚本块中,这完全正常index.html.通过"完全正常"我的意思是它解决了ko作为一个模块并找到适当的CDN链接来解析ko而不是尝试下载./js/ko.js.