单元测试的编写和维护成本更低,但它们并不涵盖所有场景.他们之间的平衡是什么?
我很想知道谁在测试Chrome.
我主要是因为它已成为我的主要浏览器,因此所有开发都在Chrome上进行,然后我使用IE和Firefox进行测试.
我目前正在努力保持我的控制器规格DRY和简洁,并在每个示例下降为一个断言.我遇到了一些困难,特别是在嵌套的结构中将实际的控制器请求调用放在哪里以匹配各种边缘情况.
这是一个示例,简化为演示问题:
describe MyController do
let(:item) { Factory(:item) }
subject { response }
describe "GET #show" do
before(:each) do
get :show
end
context "published item" do
it { should redirect_to(success_url) }
end
context "unpublished item" do
before(:each) do
item.update_attribute(published: false)
end
it { should redirect_to(error_url) }
end
end
end
Run Code Online (Sandbox Code Playgroud)
显然这是一个人为的例子,但它说明了我想做什么和什么不行.主要是,before"未发布"上下文中的块是问题所在.由于上下文嵌套的方式,我在调用后实际发生的设置数据的变化会发生什么变化get,因此该上下文中的示例实际上是使用初始场景而不是我想要的场景.
我理解为什么会发生这种情况以及上下文如何嵌套.我想我会喜欢有一些方法来告诉RSpec的想什么,我就向右运行后,任何before尚未右勾拳之前给定的范围内的任何断言.这对控制器规格来说是完美的.我想利用我的控制器规范中的嵌套来逐渐构建边缘情况的变体,而不必将get调用分散,甚至do_get在我的每个it断言中调用助手.这与it_should我正在使用的任何自定义宏保持同步尤其令人讨厌.
目前RSpec还有什么可以实现这一目标吗?有什么技巧可以用来接近吗?它看起来非常适合我看到很多人编写控制器规格的方式; 根据我的发现,人们基本上已经决定do_get在每次断言之前都要求帮助者.有没有更好的办法?
我有一个使用子域路由到代理商的应用程序:
foo.domain.dev -> Agency:showAction(foo)
bar.domain.dev -> Agency:showAction(bar)
domain.dev -> Agency:indexAction()
Run Code Online (Sandbox Code Playgroud)
这些都对应于代理实体和控制器.
我有一个监听器,它监听onDomainParse事件并将子域写入请求属性.
/**
* Listens for on domainParse event
* Writes to request attributes
*/
class SubdomainListener {
public function onDomainParse(Event $event)
{
$request = $event->getRequest();
$session = $request->getSession();
// Split the host name into tokens
$tokens = $this->tokenizeHost($request->getHost());
if (isset($tokens['subdomain'])){
$request->attributes->set('_subdomain',$tokens['subdomain']);
}
}
//...
}
Run Code Online (Sandbox Code Playgroud)
然后我在控制器中使用它来重新路由到show动作:
class AgencyController extends Controller
{
/**
* Lists all Agency entities.
*
*/
public function indexAction()
{
// We reroute to show action …Run Code Online (Sandbox Code Playgroud) 我试图在继承ActivityInstrumentationTestCase2的Android功能测试中使用Dagger.
设置代码如下所示:
@Override
protected void setUp() {
// TODO Auto-generated method stub
try {
super.setUp();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ObjectGraph.create(new TestModule()).inject(this);
this.activity = super.getActivity();
}`
Run Code Online (Sandbox Code Playgroud)
通过调用触发的OnCreate方法super.getActivity()不使用TestModule提供的类.但是如果我手动运行我的活动(在测试上下文之外),那么我的非测试模块会提供/注入所有相应的类.
我们有一个使用UI路由器构建的应用程序,其中包含一些路由解析.我们试图对它运行一些量角器测试,但似乎默认的browser.get()不等待ui路由器完全解析
这是我们的简单测试
describe('coach pages', function() {
beforeEach(function() {
browser.get("/");
});
it('should have the right title', function() {
expect(browser.getTitle()).toBe('The Title');
});
it('should have a heading', function() {
expect(element(by.css('#test')).isPresent()).toBeTruthy();
});
});
Run Code Online (Sandbox Code Playgroud)
第一个通过,它找到页面标题,但标题不是
如果我们加上这个
browser.sleep(1000);
就在第二个期望它通过之前?
量角器是否应该等待结果默认完成?是与UI路由器的某种冲突?
值得补充的是,任何没有解决它的路线似乎都按预期等待它,它只影响附加了解决方案的路线?
我的应用程序中有三个活动
我想使用espresso来测试一系列事件:单击登录活动上的登录按钮,打开主活动,然后单击主活动中的列表项,打开详细活动,然后单击详细信息中的另一个按钮活动.我开始创建这个简单的测试,以获得对listview的引用:
public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
public LoginActivityTest() {
super(LoginActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
getActivity();
}
public void testSequence() throws Exception {
// Login
onView(withId(R.id.button_log_in)).perform(click());
// Check if MainActivity is loaded
onView(withId(R.id.container)).check(matches(isDisplayed()));
// Check if Fragment is loaded
onView(withId(R.id.list)).check(matches(isDisplayed()));
}
}
Run Code Online (Sandbox Code Playgroud)
在mainActivity onCreate()方法中,我加载一个像这样的片段:
getFragmentManager().beginTransaction()
.add(R.id.container, mListFragment)
.commit();
Run Code Online (Sandbox Code Playgroud)
该ListFragment片段有一个列表(R.id.list),但仍是测试失败了NoMatchingViewException:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: com.tests.android.development:id/list
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
java android functional-testing android-fragments android-espresso
我们正处于从Jenkins迁移到Concourse CI的过程中,到目前为止一切都很顺利.但现在我有问题,我不知道如何解决.我想从社区得到任何建议.
我想要做的是可以使用Selenium运行集成或功能(Web)测试的工作.我们几乎没有问题:
正如你所看到的,这是非常重要的任务.当然,我可以创建一个包含我需要的所有内容的超级容器,但这是一个糟糕的解决方案.另一种选择是为此创建一个shell脚本,但这不够灵活.
是否有任何示例可以为此问题实施该做法或良好做法?
谢谢!
continuous-integration webtest functional-testing docker-compose concourse
我有一个Commandbus处理程序,它注入了一些服务:
class SomeHandler
{
private $service;
public function __construct(SomeService $service)
{
$this->service = $service;
}
public test(CommandTest $command)
{
$this->service->doSomeStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
SomeService的方法doSomeStuff具有外部调用,我不想在测试期间使用它。
class SomeService
{
private $someBindedVariable;
public function __construct($someBindedVariable)
{
$this->someBindedVariable = $someBindedVariable;
}
public function doSomeStuff()
{
//TODO: some stuff
}
}
Run Code Online (Sandbox Code Playgroud)
在测试中,我尝试用模拟对象替换服务
public function testTest()
{
$someService = $this->getMockBuilder(SomeService::class)->getMock();
$this->getContainer()->set(SomeService::class, $someService);
//TODO: functional test for the route, which uses SomeHandler
}
Run Code Online (Sandbox Code Playgroud)
第一个问题是该代码将引发异常““ App \ Service \ SomeService”服务是私有的,您无法替换它。”
好的,让我们尝试将其公开:
services.yaml:
App\Service\SomeService:
public: true
arguments:
$someBindedVariable: 200
Run Code Online (Sandbox Code Playgroud)
但这没有帮助。我从本地SomeService得到响应。让我们尝试使用别名: …
我们为 Excel 开发基于 Office-js 的插件,我们想要为 Windows 上的桌面版 Excel 编写自动化功能测试(最好使用 Selenium)。
我们遇到的第一个问题是 Excel/Windows 的不同组合在下面使用 IE/Edge 的 webview。让 IE 死掉,假设我们只需要使用 Edge webview 进行测试(EdgeHTML,因为 Edge-chromium webview 尚未发布)。
所以主要问题是:我们无法(或不知道如何)将插件的 webview 与 Selenium 连接,因为我们不负责启动 webview 的进程 - 它是由 Excel 本身启动的。有没有推荐的方法来运行带有插件的桌面版 Excel 的功能测试?我们可以通过 COM 来控制 Excel 本身,所以这不是问题。但是如何控制addin下面的webview呢?
我们尝试过WinAppDriver,但它提供了生成窗口的特定于 Windows 的 XML,而不是我们希望看到的插件的 HTML,这使得导航和断言变得脆弱而复杂。
我认为我们到处搜索但找不到任何漂亮的解决方案,所以肮脏的黑客也是允许的,只要它们能够可靠地工作并且不会太慢。
selenium functional-testing office-addins excel-addins office-js