我有一个 go webservices(REST Api),我们对其进行了单元测试,并且 go cover 工作得很好。
现在我们有一个用 python 编写的测试套件,它启动服务器实例,运行测试,停止服务器。
我想知道是否有一些工具允许我使用特定标志运行我的服务器二进制文件,以便最后它打印我的“黑盒”测试执行的测试的覆盖范围?
谢谢。
假设在 Symfony 3.3 中我们有一个默认控制器来绘制“Hello, world!”:
class DefaultController extends Controller
{
public function indexAction() : Response
{
return new Response( 'Hello, world!' );
}
}
Run Code Online (Sandbox Code Playgroud)
如果我想测试它,我只需创建一个 WebTestCase 并在客户端或爬虫上做一些断言,例如
class DefaultControllerTest extends WebTestCase
{
public function testIndex()
{
$client = static::createClient();
$crawler = $client->request( 'GET', '/route/to/hello-world/' );
$this->assertEquals( 200, $client->getResponse()->getStatusCode() );
$this->assertContains( 'Hello', $crawler->filter( 'body' )->text() );
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用。
假设我们有一些经过单元测试的服务。例如,IdGenerator当我们需要时,一项服务会根据某种算法创建新的 ID,并且它们只是纯文本:
class IdGenerator
{
public function generateNewId() : string;
}
Run Code Online (Sandbox Code Playgroud)
假设我们通过自动装配将其注入控制器。我们期望控制器会说出类似Hello, world, on request …
我正在将我的一个项目重写为 Symfony 5。我注意到环境变量有些奇怪。我无法再像以前在功能测试中获取它们一样获取它们了。
这并不重要,但我有自己的习惯ApiTestCase,它扩展了 Symfony 5 附带的现有测试用例。
在那里我正在做类似的事情(这不是关于我的应用程序的设计或流程的问题,只是关于如何获取变量):
<?php
namespace App\Tests;
use App\Traits\Tools\Tests\Database\UsesTestDatabase;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
* Class ApiTestCase
* @package App\Tests
*/
class ApiTestCase extends WebTestCase
{
/**
* ApiTestCase constructor.
*/
public function __construct()
{
parent::__construct();
dd(getenv('TEST_ENV_VARIABLE')) // should give me 'my secret env value'
}
}
Run Code Online (Sandbox Code Playgroud)
# this is .env.test file
############################################################################################################
#
# GENERAL SETTINGS
#
############################################################################################################
KERNEL_CLASS='App\Kernel'
APP_ENV=test
############################################################################################################
#
# TEST DATABASE CONFIGURATION
#
############################################################################################################
TEST_ENV_VARIABLE='my secret env value'
Run Code Online (Sandbox Code Playgroud)
TEST_ENV_VARIABLE …
integration-testing environment-variables functional-testing symfony symfony5
在概念上可以在测试方法中运行循环吗?
我想在控制器中测试一系列参数值,以确定不同的输入是否返回正确的值.
test "logged in user - add something - 0 qty" do
@app = Factory.create(:app)
(0..5).each do |t|
@qty = t
login(:user)
get :add. :id => @app.id, :qty => @qty
assert_nil(flash[:error])
assert_response :redirect
assert_redirect_to :controller => :apps, :action => :show, :id => @app.id
if @qty = 0
assert_equal(Invite.all.count, @qty + 1)
else
assert_something .........
end
end
Run Code Online (Sandbox Code Playgroud)
这样的事情.
Grails 1.3.5
我编写了一些功能测试,当我的控制器和服务通过grailsApplication.config引用配置数据时,我遇到了问题.它总是返回null,所以它出错了.
我知道有一个用于单元测试的mockConfig.但是如何让配置连接到功能测试呢?
我发现Symfony2中的功能测试总是尝试将页面请求为"http:// localhost"
我的环境是使用虚拟主机设置的,所以我的应用程序位于"http://symfony.dev"
经过一些测试后,我发现如果我跑:
var_dump($client->getResponse()->getContent());
Run Code Online (Sandbox Code Playgroud)
我将得到我想要的页面,但如果我var_dump $ crawler我可以看到,而不是请求像"http://symfony.dev/page"这样的页面,它请求"http:// localhost/page"
这给了404,所以我无法测试表格等等.
无论如何设置基本URL以使其工作?我应该使用像Selenium这样不同的东西吗?
我想在服务Symfony2上做一个功能测试.这个想法是之前调用控制器,然后使用该函数加载服务.功能就是这个:
function save($title,$description,$setId,$html,$validate,$articles){
$articles = explode(',', $articles);
if (false === $this->container->get('security.context')->isGranted('ROLE_USER')) {
throw new \Exception("Not allowed");
}else{
$profileId = $this->container->get('security.context')->getToken()->getUser()->getId();
$userName = $this->container->get('security.context')->getToken()->getUser()->getUserName();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的测试代码是:
$client = static::createClient();
$crawler = $client->request('GET','/sets/save',
array(
"title"=>"rtyui",
"description"=>"aksdjhashdkjahskjdh",
"set_id"=>"",
"html"=>"",
"validate"=>1,
"articels"=>"3,4"
)
);
Run Code Online (Sandbox Code Playgroud)
但是我已经没有这条线了:
if (false === $this->container->get('security.context')->isGranted('ROLE_USER')) {
throw new \Exception("Not allowed");
Run Code Online (Sandbox Code Playgroud)
现在,问题是,我如何进行验证过程?我试图做这个验证过程,如显示文档:
$client = static::createClient(array(), array(
'PHP_AUTH_USER' => 'username',
'PHP_AUTH_PW' => 'pa$$word',
));
Run Code Online (Sandbox Code Playgroud)
但我得到了同样的错误.
我正在使用Devise(v2.1.2)与Omniauth进行用户验证.我正在为一个控制器进行功能测试,该控制器将JSON对象作为POST主体,因此使用此问题中的技术来设置原始POST主体.这适用于开发,但是当我运行测试时,我得到一个完全未经验证的方法的异常:
NoMethodError: undefined method `user' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
示例测试:
test "should be able to create an item" do
m = FactoryGirl.attributes_for(:item)
raw_post :create, {}, m.to_json
assert_response :success
end
Run Code Online (Sandbox Code Playgroud)
我的模型都没有user方法,这个控制器中没有任何东西使用身份验证,所以我很困惑.完整堆栈跟踪显示错误来自Devise中此函数的第一行:
def sign_out_all_scopes(lock=true)
users = Devise.mappings.keys.map { |s| warden.user(:scope => s, :run_callbacks => false) }
warden.raw_session.inspect
warden.logout
expire_devise_cached_variables!
warden.clear_strategies_cache!
warden.lock! if lock
users.any?
end
Run Code Online (Sandbox Code Playgroud)
所以看起来在我的功能测试中(并且只在我的功能测试中)warden对象是零.
warden这里不存在物体?我正在尝试使用Selenium为Django项目运行功能测试.在Firefox和Chrome上,当我尝试测试超级用户可以将普通用户的状态更改为工作人员时,我得到了一个奇怪的外键错误(我假设这都是通过Django的内部测试验证的,但是认为这是一个好的做法,包括它在我的应用程序测试中,因为我的用户场景取决于功能).看起来Django几乎不喜欢Selenium将任何内容保存到数据库中?这个错误也会逐渐渗透到我的其他测试中,所以看起来像是在幕后打破了一些东西 - 比如Selenium失去了它的数据库连接.有谁知道为什么会这样?我愿意放弃测试以支持假设功能正常,但是我很乐意解决这个问题并使用测试.
一个可能的症状是,在Chrome中,在"选中框"和"单击保存按钮"的输出之间,我得到一个损坏的管道(在Firefox中不会发生).
每当Selenium点击"保存"按钮时,它似乎在这里打破:
# Form looks properly rendered, now click the 'Staff status'
# checkbox and submit it
isStaffCheckbox = self.browser.find_element_by_id('id_is_staff')
isStaffCheckbox.click()
print 'checked the box'
# Save the form
saveBtn = self.browser.find_element_by_css_selector('input[value="Save"]')
saveBtn.click()
print 'clicked the save button'
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是:
Traceback (most recent call last):
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/test/testcases.py", line 268, in __call__
self._post_teardown()
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/test/testcases.py", line 533, in _post_teardown
self._fixture_teardown()
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/test/testcases.py", line 553, in _fixture_teardown
skip_validation=True, reset_sequences=False)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/core/management/__init__.py", line 161, in call_command
return klass.execute(*args, **defaults)
File "~/virtual_environments/VideoSearch/lib/python2.7/site-packages/django/core/management/base.py", …Run Code Online (Sandbox Code Playgroud) django firefox selenium functional-testing selenium-chromedriver
我正在尝试在功能测试期间禁用"软可删除"过滤器,我按以下方式执行:
第一个选项:尝试tearDown()在我的测试中禁用:
protected function tearDown() {
parent::tearDown();
$entityUser = $this->em->getRepository("UserSecurityBundle:User")->find($this->user->getUser()->getId());
$filter = $this->em->getFilters()->disable('softdeleteable');
$this->em->remove($entityUser);
$this->em->flush();
$this->em->close();
}
Run Code Online (Sandbox Code Playgroud)
没工作.
第二个选项:创建一个doctrine_test.yml并在config_test.yml中导入:
imports:
- { resource: config.yml }
- { resource: doctrine_test.yml }
- { resource: security_test.yml }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我删除doctrine.yml并包含在config_prod.yml.
没工作.
这是我的doctrine_test.yml部分的样子:
filters:
softdeleteable:
class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
enabled: false
Run Code Online (Sandbox Code Playgroud)
第三个选项:禁用过滤器setUp():
public function setUp() {
static::$kernel = static::createKernel();
static::$kernel->boot();
$this->em = static::$kernel->getContainer()->get('doctrine')->getManager();
$fixture = new LoadFeeData();
$fixture->load($this->em);
$this->em->getFilters()->disable('softdeleteable');
$this->user = $this->createUser();
parent::setUp();
}
Run Code Online (Sandbox Code Playgroud)
没工作.
有什么建议?解?