在我的项目中,我使用量角器+茉莉+ TypeScript进行e2e测试。我已经在我的页面对象文件中受益于TypeScript继承的荣耀(例如,我得到了一些BasePageObject
类,其中包含从其中派生其余PageObjects的常用方法/对象。我想在我的测试中介绍相同的方法。这里是我现在得到的示例代码:
测试套件A [ATest.ts]:
import {
SomePage,
LoginPage
} from '../pages';
describe('test suite A', () => {
let loginPage: LoginPage = new LoginPage();
let somePage: SomePage = new SomePage();
beforeAll(() => {
loginPage.login();
somePage.navigateTo();
});
it('my test 1', () => {
//test body, assertions etc.
});
it('my test 2', () => {
//test body, assertions etc.
});
});
测试套件B [BTest.ts]:
import {
AnotherPage,
LoginPage
} from '../pages';
describe('test suite B', () => {
let loginPage: LoginPage = new LoginPage();
let anotherPage: AnotherPage = new AnotherPage();
beforeAll(() => {
loginPage.login();
anotherPage.navigateTo();
});
it('my test 1', () => {
//test body, assertions etc.
});
it('my test 2', () => {
//test body, assertions etc.
});
});
如您所见,某些代码对于两个套件都很常见。我希望在我的TC中实现继承,在Java Style中编写更多内容并避免代码重复(例如):
class BaseTestCase {
beforeAll() {
loginAction();
}
}
class TestA extends BaseTestCase {
beforeAll() {
specificStuff();
}
}
class TestB extends BaseTestCase {
beforeAll() {
specificStuff();
}
}
茉莉花有可能吗?
答案 0 :(得分:2)
您可以创建一个基类并轻松扩展它,然后用函数替换回调。
export abstract class BaseTest {
abstract loginAction(): void;
abstract specificStuff(): void;
}
export class FooTest extends BaseTest {
loginAction(): void {
// does stuff to login
}
specificStuff(): void {
// do tests and expectations
}
}
在你的测试中:
// Do some importing for FooTest.
describe('test suite A', () => {
let fooTest = new FooTest();
beforeAll(fooTest.loginAction);
it('should do some specific stuff', fooTest.specificStuff);
});
你应该这样做吗?
可以这样做;但是,这是你想做的事吗?我想你的FooTest
类方法会对测试做出一些期望。这(在我看来)并不是一个好的模式。您的it
块应该包含您的期望,而不是将其取出。
答案 1 :(得分:0)
此“茉莉花描述替代”看起来很有希望,但请尝试一下: https://ajsblackbelt.wordpress.com/2016/05/06/jasmine-describe-override/
(此代码尚未经过测试)
global.myDescribe = function (name, arg1, arg2, suite) {
describe(name, function){
_myDescribeLogic(name, arg1, arg2, suite);
}
};
function _myDescribeLogic(name, arg1, arg2, suite) {
beforeAll(function (done) {
// code
});
beforeEach(function (done) {
// code
});
afterAll(function (done) {
// code
});
afterEach(function (done) {
// code
});
}
将此添加到量角器配置文件中:
onPrepare: 'src/framework/myOnPreapre.js'
然后这应该起作用:
myDescribe('a suite', 'foo', 'bar', function(){
it('should test a business function', function(){
// code
})
})
别忘了扩展x-和fdescribe,如文章所述。
我为什么要这样做? 因为对于每个测试来说,有些事情总是一样的,例如登录(是的,期望登录测试,但不包括在登录测试中)。而且我不想在文件之间复制并浪费必要的*()。
应该在适当的位置定义此类Generell内容,并希望它能够无错误使用(例如在复制,粘贴和修改过程中忘记某些内容或出错)。
对我来说,一遍又一遍地读取相同的代码行的声音。它使测试更加不可读。 我只想阅读测试的特定内容。其他一切都是上下文。如果测试是关于编写和保存文本的,我不在乎登录。
出于不同的原因,我不喜欢茉莉花/量角器测试基于独立文件。对我来说,一个文件中的测试只是一个子套件。 “真实”套件是我所有的测试文件。