我使用这个yeoman生成器:https: //github.com/Swiip/generator-gulp-angular
它安装了三个测试应用程序:Jasmine,Karma,Protractor根据这篇文章(我应该使用Protractor或Karma进行端到端测试吗?),我应该使用:Karma用于例如单个控制器的小测试.Protactor如果我想测试整个应用程序并模拟用户浏览我的应用程序.根据这篇博客(http://andyshora.com/unit-testing-best-practices-angularjs.html),我将使用Jasmine进行单元测试,使用Karma进行端到端集成测试.
我猜Jasmine是编写测试的语言,另外两个执行代码,这是正确的吗?另外,如果我从未写过一个更重要的是先学习/专注的测试?
我只想切换运行一个测试,所以不必等待其他测试来查看一个测试的结果。
目前,我注释掉了其他测试,但这确实很烦人。
有没有一种方法可以切换仅运行一个测试Cypress?
我正在研究一个我们计划首先执行API的新项目,以便我们可以在其上实现Web和本机应用程序,并允许第三方集成.到目前为止所有相当标准.
我们还希望为API提供一整套自动化测试,以确保其无回归地工作,并确保其满足要求.同样,相当标准,但因为我们正在测试API,我们将使用代码内HTTP客户端而不是Web浏览器.
我们一直在寻找oauth2/OpenID Connect来促进API的身份验证和授权 - 基本上,客户端可以进行身份验证,获取访问令牌,然后使用它来访问所有API资源.
我正在努力解决的问题是让自动化测试与oauth2部分协同工作以实现调用API的好方法.第一个想法是使用"client_credentials"或"密码"授权类型,它们似乎都适用于我们想要的东西,但它们根本没有涵盖在OpenID Connect规范中,当然还有"密码" "无论如何,至少它通常不被认为是个好主意.
这是实现这一目标的最佳方式,还是有其他最佳实践可用于其他流程,但没有Web浏览器?
编辑:在(更多)阅读之后,我有了一个新的计划.完全脱机运行测试,使用针对单独数据库的单独部署,并在测试运行之前将数据直接播种到数据库中,然后使用标准OpenID Connect流,但使用:
然后,系统可以检测到这种事实组合,并自动验证提供的用户名,而无需通过浏览器.
这看起来合情合理吗?或者,还有更好的方法?
我想知道一个元素是否可见。我不知道该怎么做。我知道我们可以运行这个:
cy.get('selector').should('be.visible')
但是如果元素不可见,则测试失败。所以我只想要一个布尔值,如果元素不可见,那么我可以通过 if 条件来决定。
用例:
只有当侧边栏不可见时,我才想通过单击按钮来打开侧边菜单。
if(sidebarIsInvisible){
cy.get('#sideMenuToggleButton').click();
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我真的很感激任何贡献。
提前致谢
在角度项目中运行我的测试后,我有一个奇怪的错误 Error: Error while waiting for Protractor to sync with the page: "angular could not be found on the window".我的Protractor配置如下所示:
require('coffee-script').register();
exports.config = {
seleniumServerJar: './node_modules/protractor/selenium/selenium-server-standalone-2.39.0.jar',
seleniumAddress: 'http://localhost:4444/wd/hub',
capabilities: {
browserName: 'chrome'
//'chromeOptions': {
// 'args': ['--disable-extensions']
//}
},
specs: [
'*_spec.coffee'
],
allScriptsTimeout: 10000000000,
baseUrl: 'http://localhost:9003/',
jasmineNodeOpts: {
isVerbose: false,
showColors: true,
includeStackTrace: true,
defaultTimeoutInterval: 10000000000
}
};
Run Code Online (Sandbox Code Playgroud)
并测试:
loginPage = require './pages/log_in_page'
describe 'Log In', ->
it 'shows after login', ->
loginPage()
.setEmail('test@dispatch.me')
.setPass('a46s75d4as765d4a6s7d54as76d5as74das76d5')
Run Code Online (Sandbox Code Playgroud)
从页面获取信息:
module.exports = …Run Code Online (Sandbox Code Playgroud) 我已经开始测试一个反应webapp但我没有走远,因为我遇到了登录问题.我正在使用cypress e2e测试工具.
将显示一个欢迎页面,其中包含一个要登录的按钮,该按钮将重定向到您的auth0服务.用户使用电子邮件和密码登录,然后使用令牌重定向回webapp.
我尝试了许多不同的方法,导致了不同的问题.
注意:我不想测试Auth0,我只想输入我的webapp.
尝试1.单击登录按钮
尝试:赛普拉斯应该像用户一样做,因此测试将点击登录按钮并转到Auth0并填写凭据.问题:赛普拉斯不允许您在测试期间导航到其他域.
由于赛普拉斯更改了自己的主机URL以匹配您的应用程序的URL,因此它要求您的应用程序保留在同一个超级域中以进行单个测试.
您应该能够禁用该设置"chromeWebSecurity": false,cypress.json但它无法使用,因为您只能访问单个域cy.visit()
尝试2.从测试中以编程方式登录
尝试:使用auth0-js库登录cypress测试,因此不需要单击登录按钮,因此不会发生域更改.
describe('Waiting to fetch', () => {
beforeEach(() => {
this.fetchAuthDeferred = getDeferred()
cy.visit('http://localhost:3000', {
onBeforeLoad(win) {
cy.stub(win, 'fetch')
.withArgs($url)
.as('fetchAuth')
.returns(this.fetchAuthDeferred.promise)
}
})
})
it('login', () => {
cy.visit('http://localhost:3000')
const auth = new auth0.WebAuth(authOptions)
auth.login(loginOptions)
cy.get('@fetchAuth', { timeout: 10000 }).should('haveOwnProperty', 'token')
cy.visit('http://localhost:3000')
cy.get('[class*="hamburger"]').click()
})
})
Run Code Online (Sandbox Code Playgroud)
问题:cy.route() 不等待获取请求,解决方法是使用cy.stub(win, 'fetch').它不会等待:
尝试3.从webapp以编程方式登录
尝试:我开始认为柏树只是从应用程序发出的间谍请求,而不是来自测试本身(正如我在上面的观点中所尝试的那样).
我在欢迎页面中添加了一个假登录按钮,该按钮将 …
目前有部分端到端测试,输入用户名/密码并点击"登录".
它成功地做到了,但在"谢谢你登录"页面结束,而不是重定向到"帐户门户"或"仪表板",就像我通过浏览器登录一样.
这个项目的新功能,但我们正在使用OAuth.
主要问题:这听起来像需要http嘲笑吗?
更多详情:
spec.js
describe('login page', function() {
browser.driver.get('http://url.path/login');
it('should render login page', function() {
// Checking the current url
var currentUrl = browser.driver.getCurrentUrl();
expect(currentUrl).toMatch('/login');
});
it('should sign in', function() {
// Find page elements
var userNameField = browser.driver.findElement(By.id('username'));
var userPassField = browser.driver.findElement(By.id('password'));
var userLoginBtn = browser.driver.findElement(By.id('loginbtn'));
// Fill input fields
userNameField.sendKeys('test@user.com');
userPassField.sendKeys('1234');
// Ensure fields contain what we've entered
expect(userNameField.getAttribute('value')).toEqual('test@user.com');
expect(userPassField.getAttribute('value')).toEqual('1234');
// Click to sign in - waiting for Angular as it is manually bootstrapped.
userLoginBtn.click().then(function() { …Run Code Online (Sandbox Code Playgroud) 我想在我们团队的项目中建立一个坚实的e2e测试基础,但我找不到这个问题的简单解决方案:
当您模拟所有调用时,检测服务器返回的对象的实际模型是否已被修改的最佳方法是什么?
您的测试仍然会通过,因为他们正在测试模型的过时版本但应用程序可能已损坏.
例如,如果一个模拟假设/api/users/1返回null,如果用户不存在,当它实际上返回一个空对象,则虽然测试可以通过,被测试的行为依赖于不正确的假设,并且因此可以以意外的方式失败.
或者也许后端以某种方式提供带有最新模型的静态json文件,而前端依赖于此?
这当然假设在后端工作的人和在前端工作的人是独立的团队.
我在这里使用Angular 1.x和Protractor,但这并不依赖于技术.
我有一个数据驱动的Android应用程序支架.添加测试,旨在实现100%的覆盖率.使用OkHttp.
如何使用模拟响应透明地拦截对我的服务器的调用?
想要这种端到端和单元测试.例如:设置build-type MockServer应该加载一个将在模拟器中显示模拟响应的应用程序.
我想用端到端测试来测试我的Rest API.据我了解,集成测试之间的区别在于我们不进行内存系统配置,而是使用真实的测试数据库和网络请求.
但我无法理解如何处理第三方API请求(如GitHub或Bitbucket API).
创建假冒Github帐户是否正常,我的测试会提取假数据?
如何处理访问令牌,并非所有服务都是公开的,甚至公共服务都可能因速率限制而失败.
e2e-testing ×10
protractor ×4
angularjs ×3
cypress ×3
mocking ×2
testing ×2
unit-testing ×2
android ×1
api ×1
auth0 ×1
jasmine ×1
javascript ×1
junit ×1
karma-runner ×1
oauth ×1
oauth2 ×1
okhttp ×1
rest ×1