Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nikola Balog
erp5
Commits
7cebcfeb
Commit
7cebcfeb
authored
Sep 03, 2020
by
Arnaud Fontaine
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ZODB Components: erp5_ui_test: Migrate Unit Tests.
parent
a0d19fdd
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
689 additions
and
248 deletions
+689
-248
bt5/erp5_performance_test/TestTemplateItem/portal_components/test.erp5.testWorkflowPerformance.py
...em/portal_components/test.erp5.testWorkflowPerformance.py
+1
-1
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testGUIwithSecurity.py
...teItem/portal_components/test.erp5.testGUIwithSecurity.py
+2
-2
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testGUIwithSecurity.xml
...eItem/portal_components/test.erp5.testGUIwithSecurity.xml
+110
-0
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testListBox.py
...stTemplateItem/portal_components/test.erp5.testListBox.py
+7
-7
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testListBox.xml
...tTemplateItem/portal_components/test.erp5.testListBox.xml
+110
-0
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testPerformance.py
...mplateItem/portal_components/test.erp5.testPerformance.py
+227
-233
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testPerformance.xml
...plateItem/portal_components/test.erp5.testPerformance.xml
+110
-0
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testPlanningBox.py
...mplateItem/portal_components/test.erp5.testPlanningBox.py
+5
-5
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testPlanningBox.xml
...plateItem/portal_components/test.erp5.testPlanningBox.xml
+110
-0
bt5/erp5_ui_test/bt/template_test_id_list
bt5/erp5_ui_test/bt/template_test_id_list
+4
-0
bt5/erp5_ui_test/bt/test_dependency_list
bt5/erp5_ui_test/bt/test_dependency_list
+3
-0
No files found.
bt5/erp5_performance_test/TestTemplateItem/portal_components/test.erp5.testWorkflowPerformance.py
View file @
7cebcfeb
...
...
@@ -28,7 +28,7 @@
from
test
import
pystone
from
time
import
time
pystone
.
clock
=
time
from
Products.ERP5Type.tests
.testPerformance
import
TestPerformanceMixin
from
erp5.component.test
.testPerformance
import
TestPerformanceMixin
from
Products.DCWorkflow.DCWorkflow
import
ValidationFailed
from
Testing
import
ZopeTestCase
...
...
product/ERP5Form/tests/
testGUIwithSecurity.py
→
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.
testGUIwithSecurity.py
View file @
7cebcfeb
...
...
@@ -43,9 +43,9 @@ class TestGUISecurity(ERP5TypeTestCase):
def
getTitle
(
self
):
return
"Security Issues in GUI"
def
loginAs
(
self
,
id
=
'user'
):
def
loginAs
(
self
,
username
=
'user'
):
uf
=
self
.
getPortal
().
acl_users
user
=
uf
.
getUser
(
id
).
__of__
(
uf
)
user
=
uf
.
getUser
(
username
).
__of__
(
uf
)
newSecurityManager
(
None
,
user
)
def
stepCreateObjects
(
self
,
sequence
=
None
,
sequence_list
=
None
,
**
kw
):
...
...
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testGUIwithSecurity.xml
0 → 100644
View file @
7cebcfeb
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Test Component"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testGUIwithSecurity
</string>
</value>
</item>
<item>
<key>
<string>
default_source_reference
</string>
</key>
<value>
<string>
Products.ERP5Form.tests.testGUIwithSecurity
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
test.erp5.testGUIwithSecurity
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Test Component
</string>
</value>
</item>
<item>
<key>
<string>
sid
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
text_content_error_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
text_content_warning_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<string>
erp5
</string>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
validate
</string>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
validated
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
product/ERP5Form/tests/
testListBox.py
→
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.
testListBox.py
View file @
7cebcfeb
...
...
@@ -72,7 +72,7 @@ class TestListBox(ERP5TypeTestCase):
def
afterSetUp
(
self
):
self
.
login
()
def
login
(
self
):
def
login
(
self
,
*
args
,
**
kw
):
uf
=
self
.
getPortal
().
acl_users
uf
.
_doAddUser
(
'seb'
,
''
,
[
'Manager'
],
[])
user
=
uf
.
getUserById
(
'seb'
).
__of__
(
uf
)
...
...
@@ -296,13 +296,13 @@ class TestListBox(ERP5TypeTestCase):
],)
foo_module
=
portal
.
foo_module
o
=
foo_module
.
newContent
(
title
=
u'
\
xe9
lisa'
)
foo_module
.
newContent
(
title
=
u'
\
xe9
lisa'
)
self
.
tic
()
request
=
get_request
()
request
[
'here'
]
=
portal
.
foo_module
try
:
rendered
=
listbox
.
get_value
(
'default'
,
render_format
=
'list'
,
REQUEST
=
request
)
listbox
.
get_value
(
'default'
,
render_format
=
'list'
,
REQUEST
=
request
)
except
UnicodeError
,
e
:
self
.
fail
(
'Rendering failed: %s'
%
e
)
self
.
assertIn
(
u"http://example.com/?
\
xe9
lisa"
,
listbox
.
render
(
REQUEST
=
request
))
...
...
@@ -330,13 +330,13 @@ class TestListBox(ERP5TypeTestCase):
],)
foo_module
=
portal
.
foo_module
o
=
foo_module
.
newContent
(
title
=
u'
\
xe9
lisa'
)
foo_module
.
newContent
(
title
=
u'
\
xe9
lisa'
)
self
.
tic
()
request
=
get_request
()
request
[
'here'
]
=
portal
.
foo_module
try
:
rendered
=
listbox
.
get_value
(
'default'
,
render_format
=
'list'
,
REQUEST
=
request
)
listbox
.
get_value
(
'default'
,
render_format
=
'list'
,
REQUEST
=
request
)
except
UnicodeError
,
e
:
self
.
fail
(
'Rendering failed: %s'
%
e
)
self
.
assertIn
(
u"http://example.com/?
\
xe9
lisa"
,
listbox
.
render
(
REQUEST
=
request
))
...
...
@@ -481,7 +481,7 @@ class TestListBox(ERP5TypeTestCase):
# Create an new empty object with a list property
foo_module
=
portal
.
foo_module
o
=
foo_module
.
newContent
()
foo_module
.
newContent
()
# Reindex
self
.
tic
()
...
...
@@ -566,7 +566,7 @@ class TestListBox(ERP5TypeTestCase):
# Create an new empty object with a list property
foo_module
=
portal
.
foo_module
o
=
foo_module
.
newContent
()
foo_module
.
newContent
()
# Reindex
self
.
tic
()
...
...
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testListBox.xml
0 → 100644
View file @
7cebcfeb
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Test Component"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testListBox
</string>
</value>
</item>
<item>
<key>
<string>
default_source_reference
</string>
</key>
<value>
<string>
Products.ERP5Form.tests.testListBox
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
test.erp5.testListBox
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Test Component
</string>
</value>
</item>
<item>
<key>
<string>
sid
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
text_content_error_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
text_content_warning_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<string>
erp5
</string>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
validate
</string>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
validated
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
product/ERP5Type/tests/
testPerformance.py
→
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.
testPerformance.py
View file @
7cebcfeb
...
...
@@ -26,7 +26,6 @@
#
##############################################################################
import
unittest
from
time
import
time
import
gc
import
subprocess
...
...
@@ -120,174 +119,185 @@ PROFILER = 'pprofile'
class
TestPerformanceMixin
(
ERP5TypeTestCase
,
LogInterceptor
):
def
getBusinessTemplateList
(
self
):
"""
def
getBusinessTemplateList
(
self
):
"""
Return the list of business templates.
"""
return
(
'erp5_base'
,
'erp5_ui_test'
,)
"""
return
(
'erp5_base'
,
'erp5_ui_test'
,)
def
afterSetUp
(
self
):
"""
def
afterSetUp
(
self
):
"""
Executed before each test_*.
"""
# We don't want cpu time to be spent by random external sources:
# - Bot should have its SQL database in a tmpfs storage.
# - As bot delete all '*.pyc' files before updating the working copy,
# all '*.pyc' files have just been recreated. They should be synced:
subprocess
.
call
(
'sync'
)
# - Prevent GC from happening.
# It would increase the "crosstalk" between using more ram and using more cpu.
# Another problem is that it makes result even less reproductible on another
# machine where memory use does not evolve identicaly (ie. x86_64 arch,
# because of 64bits pointers).
gc
.
disable
()
self
.
login
()
self
.
bar_module
=
self
.
getBarModule
()
self
.
foo_module
=
self
.
portal
.
foo_module
def
getBarModule
(
self
):
"""
"""
# We don't want cpu time to be spent by random external sources:
# - Bot should have its SQL database in a tmpfs storage.
# - As bot delete all '*.pyc' files before updating the working copy,
# all '*.pyc' files have just been recreated. They should be synced:
subprocess
.
call
(
'sync'
)
# - Prevent GC from happening.
# It would increase the "crosstalk" between using more ram and using more cpu.
# Another problem is that it makes result even less reproductible on another
# machine where memory use does not evolve identicaly (ie. x86_64 arch,
# because of 64bits pointers).
gc
.
disable
()
self
.
login
()
self
.
bar_module
=
self
.
getBarModule
()
self
.
foo_module
=
self
.
portal
.
foo_module
def
getBarModule
(
self
):
"""
Return the bar module
"""
return
self
.
portal
[
'bar_module'
]
"""
return
self
.
portal
[
'bar_module'
]
def
profile
(
self
,
func
,
suffix
=
''
,
args
=
(),
kw
=
None
):
"""Profile `func(*args, **kw)` with selected profiler,
def
profile
(
self
,
func
,
suffix
=
''
,
args
=
(),
kw
=
None
):
"""Profile `func(*args, **kw)` with selected profiler,
and dump output in a file called `func.__name__ + suffix`
"""
if
not
kw
:
kw
=
{}
if
PROFILER
==
'pprofile'
:
import
pprofile
prof
=
pprofile
.
Profile
()
else
:
from
cProfile
import
Profile
prof
=
Profile
()
prof_file
=
'%s%s'
%
(
func
.
__name__
,
suffix
)
try
:
os
.
unlink
(
prof_file
)
except
OSError
:
pass
prof
.
runcall
(
func
,
*
args
,
**
kw
)
prof
.
dump_stats
(
prof_file
)
def
beforeTearDown
(
self
):
# Re-enable gc at teardown.
gc
.
enable
()
self
.
abort
()
"""
if
not
kw
:
kw
=
{}
if
PROFILER
==
'pprofile'
:
import
pprofile
prof
=
pprofile
.
Profile
()
else
:
from
cProfile
import
Profile
prof
=
Profile
()
prof_file
=
'%s%s'
%
(
func
.
__name__
,
suffix
)
try
:
os
.
unlink
(
prof_file
)
except
OSError
:
pass
prof
.
runcall
(
func
,
*
args
,
**
kw
)
prof
.
dump_stats
(
prof_file
)
def
beforeTearDown
(
self
):
# Re-enable gc at teardown.
gc
.
enable
()
self
.
abort
()
class
TestPerformance
(
TestPerformanceMixin
):
def
getTitle
(
self
):
return
"Performance"
def
beforeTearDown
(
self
):
super
(
TestPerformance
,
self
).
beforeTearDown
()
self
.
bar_module
.
manage_delObjects
(
list
(
self
.
bar_module
.
objectIds
()))
self
.
foo_module
.
manage_delObjects
(
list
(
self
.
foo_module
.
objectIds
()))
gender
=
self
.
portal
.
portal_categories
[
'gender'
]
gender
.
manage_delObjects
(
list
(
gender
.
objectIds
()))
gender
=
self
.
portal
.
portal_caches
.
clearAllCache
()
self
.
tic
()
def
getTitle
(
self
):
return
"Performance"
def
beforeTearDown
(
self
):
super
(
TestPerformance
,
self
).
beforeTearDown
()
self
.
bar_module
.
manage_delObjects
(
list
(
self
.
bar_module
.
objectIds
()))
self
.
foo_module
.
manage_delObjects
(
list
(
self
.
foo_module
.
objectIds
()))
gender
=
self
.
portal
.
portal_categories
[
'gender'
]
gender
.
manage_delObjects
(
list
(
gender
.
objectIds
()))
gender
=
self
.
portal
.
portal_caches
.
clearAllCache
()
self
.
tic
()
def
checkViewBarObject
(
self
,
min
,
max
,
prefix
=
None
):
# Some init to display form with some value
if
prefix
is
None
:
prefix
=
''
gender
=
self
.
portal
.
portal_categories
[
'gender'
]
if
'male'
not
in
gender
.
objectIds
():
gender
.
newContent
(
id
=
'male'
,
title
=
'Male'
,
portal_type
=
'Category'
)
if
'female'
not
in
gender
.
objectIds
():
gender
.
newContent
(
id
=
'female'
,
title
=
'Female'
,
portal_type
=
'Category'
)
bar
=
self
.
bar_module
.
newContent
(
id
=
'bar'
,
portal_type
=
'Bar'
,
title
=
'Bar Test'
,
quantity
=
10000
,)
bar
.
setReference
(
bar
.
getRelativeUrl
())
self
.
tic
()
# Check performance
before_view
=
time
()
for
x
in
xrange
(
100
):
# XXX: Note that we don't clean TransactionVariable cache and REQUEST
# before each call to 'view' requests. In reality, they would be
# always empty at the beginning of such requests.
# If you work to improve performance of 'view' requests using this
# kind of cache, make sure it is actually useful outside
# testPerformance.
bar
.
Bar_viewPerformance
()
after_view
=
time
()
req_time
=
(
after_view
-
before_view
)
/
100.
print
"%s time to view object form %.4f < %.4f < %.4f
\
n
"
%
\
(
prefix
,
min
,
req_time
,
max
)
def
checkViewBarObject
(
self
,
min_
,
max_
,
prefix
=
None
):
# Some init to display form with some value
if
prefix
is
None
:
prefix
=
''
gender
=
self
.
portal
.
portal_categories
[
'gender'
]
if
'male'
not
in
gender
.
objectIds
():
gender
.
newContent
(
id
=
'male'
,
title
=
'Male'
,
portal_type
=
'Category'
)
if
'female'
not
in
gender
.
objectIds
():
gender
.
newContent
(
id
=
'female'
,
title
=
'Female'
,
portal_type
=
'Category'
)
bar
=
self
.
bar_module
.
newContent
(
id
=
'bar'
,
portal_type
=
'Bar'
,
title
=
'Bar Test'
,
quantity
=
10000
,)
bar
.
setReference
(
bar
.
getRelativeUrl
())
self
.
tic
()
# Check performance
before_view
=
time
()
for
_
in
xrange
(
100
):
# XXX: Note that we don't clean TransactionVariable cache and REQUEST
# before each call to 'view' requests. In reality, they would be
# always empty at the beginning of such requests.
# If you work to improve performance of 'view' requests using this
# kind of cache, make sure it is actually useful outside
# testPerformance.
bar
.
Bar_viewPerformance
()
after_view
=
time
()
req_time
=
(
after_view
-
before_view
)
/
100.
print
"%s time to view object form %.4f < %.4f < %.4f
\
n
"
%
\
(
prefix
,
min_
,
req_time
,
max_
)
if
PROFILE
:
self
.
profile
(
bar
.
Bar_viewPerformance
)
if
DO_TEST
:
self
.
assertTrue
(
min_
<
req_time
<
max_
,
'%.4f < %.4f < %.4f'
%
(
min_
,
req_time
,
max_
))
def
test_00_viewBarObject
(
self
,
min_
=
None
,
max_
=
None
):
"""
Estimate average time to render object view
"""
message
=
'Test form to view Bar object'
LOG
(
'Testing... '
,
0
,
message
)
self
.
checkViewBarObject
(
MIN_OBJECT_VIEW
,
MAX_OBJECT_VIEW
,
prefix
=
'objective'
)
def
test_01_viewBarModule
(
self
):
"""
Estimate average time to render module view
"""
message
=
'Test form to view Bar module'
LOG
(
'Testing... '
,
0
,
message
)
self
.
tic
()
view_result
=
{}
tic_result
=
{}
add_result
=
{}
# call view once to fill caches
self
.
bar_module
.
BarModule_viewBarList
()
# add object in bar module
for
i
in
xrange
(
10
):
def
add
():
for
x
in
xrange
(
100
):
self
.
bar_module
.
newContent
(
portal_type
=
'Bar'
,
title
=
'Bar Test'
,
quantity
=
"%4d"
%
(
x
,))
before_add
=
time
()
if
PROFILE
:
self
.
profile
(
bar
.
Bar_viewPerformance
)
if
DO_TEST
:
self
.
assertTrue
(
min
<
req_time
<
max
,
'%.4f < %.4f < %.4f'
%
(
min
,
req_time
,
max
))
def
test_00_viewBarObject
(
self
,
min
=
None
,
max
=
None
):
"""
Estimate average time to render object view
"""
message
=
'Test form to view Bar object'
LOG
(
'Testing... '
,
0
,
message
)
self
.
checkViewBarObject
(
MIN_OBJECT_VIEW
,
MAX_OBJECT_VIEW
,
prefix
=
'objective'
)
def
test_01_viewBarModule
(
self
):
"""
Estimate average time to render module view
"""
message
=
'Test form to view Bar module'
LOG
(
'Testing... '
,
0
,
message
)
self
.
tic
()
view_result
=
{}
tic_result
=
{}
add_result
=
{}
# call view once to fill caches
self
.
bar_module
.
BarModule_viewBarList
()
# add object in bar module
for
i
in
xrange
(
10
):
def
add
():
for
x
in
xrange
(
100
):
p
=
self
.
bar_module
.
newContent
(
portal_type
=
'Bar'
,
title
=
'Bar Test'
,
quantity
=
"%4d"
%
(
x
,))
before_add
=
time
()
if
PROFILE
:
self
.
profile
(
add
,
i
)
else
:
add
()
after_add
=
time
()
self
.
commit
()
before_tic
=
time
()
if
PROFILE
:
self
.
profile
(
self
.
tic
,
i
)
else
:
self
.
tic
()
after_tic
=
time
()
gc
.
collect
()
before_form
=
time
()
for
x
in
xrange
(
100
):
self
.
bar_module
.
BarModule_viewBarList
()
after_form
=
time
()
# store result
key
=
"%06d"
%
(
100
*
i
+
100
,)
view_result
[
key
]
=
(
after_form
-
before_form
)
/
100.
tic_result
[
key
]
=
(
after_tic
-
before_tic
)
/
100.
add_result
[
key
]
=
(
after_add
-
before_add
)
/
100.
if
PROFILE
:
self
.
profile
(
self
.
bar_module
.
BarModule_viewBarList
,
i
)
keys
=
view_result
.
keys
()
keys
.
sort
()
# first display results
self
.
profile
(
add
,
i
)
else
:
add
()
after_add
=
time
()
self
.
commit
()
before_tic
=
time
()
if
PROFILE
:
self
.
profile
(
self
.
tic
,
i
)
else
:
self
.
tic
()
after_tic
=
time
()
gc
.
collect
()
before_form
=
time
()
for
_
in
xrange
(
100
):
self
.
bar_module
.
BarModule_viewBarList
()
after_form
=
time
()
# store result
key
=
"%06d"
%
(
100
*
i
+
100
,)
view_result
[
key
]
=
(
after_form
-
before_form
)
/
100.
tic_result
[
key
]
=
(
after_tic
-
before_tic
)
/
100.
add_result
[
key
]
=
(
after_add
-
before_add
)
/
100.
if
PROFILE
:
self
.
profile
(
self
.
bar_module
.
BarModule_viewBarList
,
i
)
keys
=
view_result
.
keys
()
keys
.
sort
()
# first display results
i
=
0
for
key
in
keys
:
module_value
=
view_result
[
key
]
tic_value
=
tic_result
[
key
]
add_value
=
add_result
[
key
]
min_view
=
MIN_MODULE_VIEW
+
LISTBOX_COEF
*
i
max_view
=
MAX_MODULE_VIEW
+
LISTBOX_COEF
*
i
print
"nb objects = %s
\
n
\
t
add = %.4f < %.4f < %.4f"
%
(
key
,
MIN_OBJECT_CREATION
,
add_value
,
MAX_OBJECT_CREATION
)
print
"
\
t
tic = %.4f < %.4f < %.4f"
%
(
MIN_TIC
,
tic_value
,
MAX_TIC
)
print
"
\
t
view = %.4f < %.4f < %.4f"
%
(
min_view
,
module_value
,
max_view
)
print
i
+=
1
# then check results
if
DO_TEST
:
i
=
0
for
key
in
keys
:
module_value
=
view_result
[
key
]
...
...
@@ -295,102 +305,86 @@ class TestPerformance(TestPerformanceMixin):
add_value
=
add_result
[
key
]
min_view
=
MIN_MODULE_VIEW
+
LISTBOX_COEF
*
i
max_view
=
MAX_MODULE_VIEW
+
LISTBOX_COEF
*
i
print
"nb objects = %s
\
n
\
t
add = %.4f < %.4f < %.4f"
%
(
key
,
MIN_OBJECT_CREATION
,
add_value
,
MAX_OBJECT_CREATION
)
print
"
\
t
tic = %.4f < %.4f < %.4f"
%
(
MIN_TIC
,
tic_value
,
MAX_TIC
)
print
"
\
t
view = %.4f < %.4f < %.4f"
%
(
min_view
,
module_value
,
max_view
)
print
self
.
assertTrue
(
min_view
<
module_value
<
max_view
,
'View: %.4f < %.4f < %.4f'
%
(
min_view
,
module_value
,
max_view
))
self
.
assertTrue
(
MIN_OBJECT_CREATION
<
add_value
<
MAX_OBJECT_CREATION
,
'Create: %.4f < %.4f < %.4f'
%
(
MIN_OBJECT_CREATION
,
add_value
,
MAX_OBJECT_CREATION
))
self
.
assertTrue
(
MIN_TIC
<
tic_value
<
MAX_TIC
,
'Tic: %.4f < %.4f < %.4f'
%
(
MIN_TIC
,
tic_value
,
MAX_TIC
))
i
+=
1
# then check results
if
DO_TEST
:
i
=
0
for
key
in
keys
:
module_value
=
view_result
[
key
]
tic_value
=
tic_result
[
key
]
add_value
=
add_result
[
key
]
min_view
=
MIN_MODULE_VIEW
+
LISTBOX_COEF
*
i
max_view
=
MAX_MODULE_VIEW
+
LISTBOX_COEF
*
i
self
.
assertTrue
(
min_view
<
module_value
<
max_view
,
'View: %.4f < %.4f < %.4f'
%
(
min_view
,
module_value
,
max_view
))
self
.
assertTrue
(
MIN_OBJECT_CREATION
<
add_value
<
MAX_OBJECT_CREATION
,
'Create: %.4f < %.4f < %.4f'
%
(
MIN_OBJECT_CREATION
,
add_value
,
MAX_OBJECT_CREATION
))
self
.
assertTrue
(
MIN_TIC
<
tic_value
<
MAX_TIC
,
'Tic: %.4f < %.4f < %.4f'
%
(
MIN_TIC
,
tic_value
,
MAX_TIC
))
i
+=
1
def
test_viewProxyField
(
self
):
# render a form with proxy fields: Foo_viewProxyField
foo
=
self
.
foo_module
.
newContent
(
def
test_viewProxyField
(
self
):
# render a form with proxy fields: Foo_viewProxyField
foo
=
self
.
foo_module
.
newContent
(
portal_type
=
'Foo'
,
title
=
'Bar Test'
,
quantity
=
10000
,
price
=
32
,
start_date
=
DateTime
(
2008
,
1
,
1
))
foo
.
newContent
(
portal_type
=
'Foo Line'
,
title
=
'Line 1'
)
foo
.
newContent
(
portal_type
=
'Foo Line'
,
title
=
'Line 2'
)
self
.
tic
()
# Check performance
before_view
=
time
()
for
x
in
xrange
(
100
):
foo
.
Foo_viewProxyField
()
after_view
=
time
()
req_time
=
(
after_view
-
before_view
)
/
100.
print
"time to view proxyfield form %.4f < %.4f < %.4f
\
n
"
%
\
foo
.
newContent
(
portal_type
=
'Foo Line'
,
title
=
'Line 1'
)
foo
.
newContent
(
portal_type
=
'Foo Line'
,
title
=
'Line 2'
)
self
.
tic
()
# Check performance
before_view
=
time
()
for
_
in
xrange
(
100
):
foo
.
Foo_viewProxyField
()
after_view
=
time
()
req_time
=
(
after_view
-
before_view
)
/
100.
print
"time to view proxyfield form %.4f < %.4f < %.4f
\
n
"
%
\
(
MIN_OBJECT_PROXYFIELD_VIEW
,
req_time
,
MAX_OBJECT_PROXYFIELD_VIEW
)
if
PROFILE
:
self
.
profile
(
foo
.
Foo_viewProxyField
)
if
DO_TEST
:
self
.
assertTrue
(
MIN_OBJECT_PROXYFIELD_VIEW
<
req_time
if
PROFILE
:
self
.
profile
(
foo
.
Foo_viewProxyField
)
if
DO_TEST
:
self
.
assertTrue
(
MIN_OBJECT_PROXYFIELD_VIEW
<
req_time
<
MAX_OBJECT_PROXYFIELD_VIEW
,
'%.4f < %.4f < %.4f'
%
(
MIN_OBJECT_PROXYFIELD_VIEW
,
req_time
,
MAX_OBJECT_PROXYFIELD_VIEW
))
def
test_02_viewFooObjectWithManyLines
(
self
):
"""
Estimate average time to render object view with many lines
"""
foo
=
self
.
foo_module
.
newContent
(
portal_type
=
'Foo'
,
title
=
'Foo Test'
)
for
i
in
xrange
(
100
):
foo
.
newContent
(
portal_type
=
'Foo Line'
,
title
=
'Line %s'
%
i
)
self
.
tic
()
# Check performance
before_view
=
time
()
for
x
in
xrange
(
100
):
foo
.
Foo_viewPerformance
()
after_view
=
time
()
req_time
=
(
after_view
-
before_view
)
/
100.
print
"time to view object form with many lines %.4f < %.4f < %.4f
\
n
"
%
\
def
test_02_viewFooObjectWithManyLines
(
self
):
"""
Estimate average time to render object view with many lines
"""
foo
=
self
.
foo_module
.
newContent
(
portal_type
=
'Foo'
,
title
=
'Foo Test'
)
for
i
in
xrange
(
100
):
foo
.
newContent
(
portal_type
=
'Foo Line'
,
title
=
'Line %s'
%
i
)
self
.
tic
()
# Check performance
before_view
=
time
()
for
_
in
xrange
(
100
):
foo
.
Foo_viewPerformance
()
after_view
=
time
()
req_time
=
(
after_view
-
before_view
)
/
100.
print
"time to view object form with many lines %.4f < %.4f < %.4f
\
n
"
%
\
(
MIN_OBJECT_MANY_LINES_VIEW
,
req_time
,
MAX_OBJECT_MANY_LINES_VIEW
)
if
PROFILE
:
self
.
profile
(
foo
.
Foo_viewPerformance
)
if
DO_TEST
:
self
.
assertTrue
(
MIN_OBJECT_MANY_LINES_VIEW
<
req_time
if
PROFILE
:
self
.
profile
(
foo
.
Foo_viewPerformance
)
if
DO_TEST
:
self
.
assertTrue
(
MIN_OBJECT_MANY_LINES_VIEW
<
req_time
<
MAX_OBJECT_MANY_LINES_VIEW
,
'%.4f < %.4f < %.4f'
%
(
MIN_OBJECT_MANY_LINES_VIEW
,
req_time
,
MAX_OBJECT_MANY_LINES_VIEW
))
class
TestPropertyPerformance
(
TestPerformanceMixin
):
def
afterSetUp
(
self
):
super
(
TestPerformanceMixin
,
self
).
afterSetUp
()
super
(
TestPerformanceMixin
,
self
).
afterSetUp
()
# pylint: disable=bad-super-call
self
.
foo
=
self
.
portal
.
foo_module
.
newContent
(
portal_type
=
'Foo'
,
title
=
'Foo Test'
,
...
...
@@ -433,27 +427,27 @@ class TestPropertyPerformance(TestPerformanceMixin):
self
.
assertRaises
(
Unauthorized
,
getProperty
,
'protected_property'
)
@
self
.
_benchmark
(
100000
,
0.0001
,
1
)
def
getPropertyWithRestrictedPropertyRefused
(
_
):
def
getPropertyWithRestrictedPropertyRefused
(
_
):
# pylint: disable=unused-variable
getProperty
(
'protected_property'
,
checked_permission
=
'Access contents information'
)
def
test_getProperty_protected_property_allowed
(
self
):
getProperty
=
self
.
foo
.
getProperty
self
.
login
()
@
self
.
_benchmark
(
100000
,
0.0001
,
1
)
def
getPropertyWithRestrictedPropertyAllowed
(
_
):
def
getPropertyWithRestrictedPropertyAllowed
(
_
):
# pylint: disable=unused-variable
getProperty
(
'protected_property'
,
checked_permission
=
'Access contents information'
)
def
test_getProperty_simple_property
(
self
):
getProperty
=
self
.
foo
.
getProperty
@
self
.
_benchmark
(
100000
,
0.0001
,
1
)
def
getPropertyWithSimpleProperty
(
_
):
def
getPropertyWithSimpleProperty
(
_
):
# pylint: disable=unused-variable
getProperty
(
'title'
,
checked_permission
=
'Access contents information'
)
def
test_edit_restricted_properties
(
self
):
_edit
=
self
.
foo
.
edit
self
.
login
()
@
self
.
_benchmark
(
10000
,
0.0001
,
1
)
def
edit
(
i
):
def
edit
(
i
):
# pylint: disable=unused-variable
_edit
(
title
=
str
(
i
),
protected_property
=
str
(
i
)
...
...
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testPerformance.xml
0 → 100644
View file @
7cebcfeb
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Test Component"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testPerformance
</string>
</value>
</item>
<item>
<key>
<string>
default_source_reference
</string>
</key>
<value>
<string>
Products.ERP5Type.tests.testPerformance
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
test.erp5.testPerformance
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Test Component
</string>
</value>
</item>
<item>
<key>
<string>
sid
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
text_content_error_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
text_content_warning_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<string>
erp5
</string>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
validate
</string>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
validated
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
product/ERP5Form/tests/
testPlanningBox.py
→
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.
testPlanningBox.py
View file @
7cebcfeb
...
...
@@ -52,15 +52,15 @@ class TestPlanningBox(ERP5TypeTestCase):
def
getBusinessTemplateList
(
self
):
# Use the same framework as the functional testing for convenience.
# This adds some specific portal types and skins.
return
(
'erp5_ui_test'
,)
return
(
'erp5_ui_test'
,)
def
getTitle
(
self
):
return
"PlanningBox"
return
"PlanningBox"
def
afterSetUp
(
self
):
self
.
login
()
self
.
login
()
def
login
(
self
):
def
login
(
self
,
*
args
,
**
kw
):
uf
=
self
.
getPortal
().
acl_users
uf
.
_doAddUser
(
'seb'
,
''
,
[
'Manager'
],
[])
user
=
uf
.
getUserById
(
'seb'
).
__of__
(
uf
)
...
...
@@ -125,7 +125,7 @@ class TestPlanningBox(ERP5TypeTestCase):
self
.
assertEqual
(
sec_axis_info
[
'bound_start'
],
today
)
self
.
assertEqual
(
sec_axis_info
[
'bound_stop'
],
today
+
1
)
for
tree_list
,
activity_list
,
stat
in
basic
.
report_group_list
:
for
_
,
activity_list
,
_
in
basic
.
report_group_list
:
self
.
assertEqual
(
len
(
activity_list
),
1
)
...
...
bt5/erp5_ui_test/TestTemplateItem/portal_components/test.erp5.testPlanningBox.xml
0 → 100644
View file @
7cebcfeb
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Test Component"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testPlanningBox
</string>
</value>
</item>
<item>
<key>
<string>
default_source_reference
</string>
</key>
<value>
<string>
Products.ERP5Form.tests.testPlanningBox
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
test.erp5.testPlanningBox
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Test Component
</string>
</value>
</item>
<item>
<key>
<string>
sid
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
text_content_error_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
text_content_warning_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<string>
erp5
</string>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
validate
</string>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
validated
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_ui_test/bt/template_test_id_list
View file @
7cebcfeb
test.erp5.testGUIwithSecurity
test.erp5.testListBox
test.erp5.testPerformance
test.erp5.testPlanningBox
test.erp5.testRelationField
\ No newline at end of file
bt5/erp5_ui_test/bt/test_dependency_list
0 → 100644
View file @
7cebcfeb
erp5_full_text_mroonga_catalog
erp5_core_proxy_field_legacy
erp5_base
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment