This commit is contained in:
csxjy 2022-03-18 15:23:53 +08:00
parent 4721a0745c
commit 9007071ae2
522 changed files with 13469 additions and 2 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,52 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<DBN-PSQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false" />
</DBN-PSQL>
<DBN-SQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false">
<option name="STATEMENT_SPACING" value="one_line" />
<option name="CLAUSE_CHOP_DOWN" value="chop_down_if_statement_long" />
<option name="ITERATION_ELEMENTS_WRAPPING" value="chop_down_if_not_single" />
</formatting-settings>
</DBN-SQL>
<DBN-PSQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false" />
</DBN-PSQL>
<DBN-SQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false">
<option name="STATEMENT_SPACING" value="one_line" />
<option name="CLAUSE_CHOP_DOWN" value="chop_down_if_statement_long" />
<option name="ITERATION_ELEMENTS_WRAPPING" value="chop_down_if_not_single" />
</formatting-settings>
</DBN-SQL>
</code_scheme>
</component>

455
.idea/dbnavigator.xml Normal file
View File

@ -0,0 +1,455 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DataEditorManager">
<record-view-column-sorting-type value="BY_INDEX" />
<value-preview-text-wrapping value="true" />
<value-preview-pinned value="false" />
</component>
<component name="DBNavigator.Project.DataExportManager">
<export-instructions>
<create-header value="true" />
<quote-values-containing-separator value="true" />
<quote-all-values value="false" />
<value-separator value="" />
<file-name value="" />
<file-location value="" />
<scope value="GLOBAL" />
<destination value="FILE" />
<format value="EXCEL" />
<charset value="UTF-8" />
</export-instructions>
</component>
<component name="DBNavigator.Project.DatabaseBrowserManager">
<autoscroll-to-editor value="false" />
<autoscroll-from-editor value="true" />
<show-object-properties value="true" />
<loaded-nodes />
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.EditorStateManager">
<last-used-providers />
</component>
<component name="DBNavigator.Project.MethodExecutionManager">
<method-browser />
<execution-history>
<group-entries value="true" />
<execution-inputs />
</execution-history>
<argument-values-cache />
</component>
<component name="DBNavigator.Project.ObjectDependencyManager">
<last-used-dependency-type value="INCOMING" />
</component>
<component name="DBNavigator.Project.ObjectQuickFilterManager">
<last-used-operator value="EQUAL" />
<filters />
</component>
<component name="DBNavigator.Project.ScriptExecutionManager" clear-outputs="true">
<recently-used-interfaces />
</component>
<component name="DBNavigator.Project.Settings">
<connections />
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="NESTED TABLE" enabled="false" />
<object-type name="COLUMN" enabled="false" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE ATTRIBUTE" enabled="false" />
<object-type name="ARGUMENT" enabled="false" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="true" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<tracking-columns>
<columnNames value="" />
<visible value="true" />
<editable value="false" />
</tracking-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="Properties" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="YAML" enabled="true" />
<content-type name="Bash" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
<debugger>
<debugger-type value="JDBC" />
<use-generic-runners value="true" />
</debugger>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
<component name="DBNavigator.Project.StatementExecutionManager">
<execution-variables />
</component>
</project>

4
.idea/encodings.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

View File

@ -0,0 +1,13 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="class_examples.test_survey.survey" />
<option value="test.test_data_excise.read_yml" />
</list>
</option>
</inspection_tool>
</profile>
</component>

4
.idea/misc.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/pytest_book.iml" filepath="$PROJECT_DIR$/.idea/pytest_book.iml" />
</modules>
</component>
</project>

21
.idea/pytest_book.iml Normal file
View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/chapter7unit/class_examples" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/chapter9selenium/test" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/chapter11_BDD/pytestbdd" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/chapter10appium/Pappium-youdao-demo" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/chapter12/Mock" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/chapter5" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/src/chapter7unit/code_examples" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="projectConfiguration" value="pytest" />
<option name="PROJECT_TEST_RUNNER" value="pytest" />
</component>
</module>

7
.idea/vcs.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

1203
.idea/workspace.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,2 +0,0 @@
# pytest_book

BIN
docs/.DS_Store vendored Normal file

Binary file not shown.

7
setup.py Normal file
View File

@ -0,0 +1,7 @@
# Author: lindafang
# Date: 2020-05-13 21:02
# File: setup.py
from setuptools import setup, find_packages
setup(name="Utils", packages=find_packages())

BIN
src/.DS_Store vendored Normal file

Binary file not shown.

3
src/__init__.py Normal file
View File

@ -0,0 +1,3 @@
# Author: lindafang
# Date: 2020-04-13 15:11
# File: __init__.py

Binary file not shown.

View File

@ -0,0 +1,3 @@
# Author: lindafang
# Date: 2020-04-13 15:32
# File: __init__.py.py

Binary file not shown.

View File

@ -0,0 +1,3 @@
# Author: lindafang
# Date: 2020-04-13 15:32
# File: __init__.py.py

View File

@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
FOSS_LICENSES = ['Apache 2.0', 'MIT', 'GPL', 'BSD']
PYTHON_PKGS = ['pytest-automationtest', 'requests-api', 'django-web', 'cookiecutter-项目模板']
class Package:
def __init__(self, name, license):
self.name = name
self.license = license
@property
def is_open_source(self):
return self.license in FOSS_LICENSES
class Person:
def __init__(self, name, gender):
self.name = name
self.gender = gender
self._skills = ['eating', 'sleeping']
def learn(self, skill):
self._skills.append(skill)
@property
def looks_like_a_programmer(self):
return any(
package in self._skills
for package in PYTHON_PKGS
)
class Woman(Person):
def __init__(self, name):
super().__init__(name, '')
class Man(Person):
def __init__(self, name):
super().__init__(name, '')

View File

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
import operator
import pytest
from .foobar import Package, Woman, Man
PACKAGES = [
Package('requests-api', 'Apache 2.0'),
Package('django-web', 'BSD'),
Package('pytest-automationtest', 'MIT'),
]
@pytest.fixture(params=PACKAGES, ids=(operator.attrgetter('name')))
def python_package(request):
return request.param
@pytest.mark.parametrize('person', [
Woman('lindafang'), Woman('nanzhang'),
Man('wenli'), Woman('mingzhao'), Man('dongjin')
], ids=())
def test_become_a_programmer(person, python_package):
person.learn(python_package.name)
print(person._skills)
assert person.looks_like_a_programmer
def test_is_open_source(python_package):
assert python_package.is_open_source
if __name__ == '__main__':
pytest.main()

View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
import pytest
# 这是一个英国游戏逢3就fizz,逢5就buzz如果是35的倍数则fizzbuzz
# 类似中国的逢3或3的倍数就敲一下桌子其他就说出来124578101114
RULES = (
(3 * 5, "FizzBuzz"),
(3, "Fizz"),
(5, "Buzz"),
)
def fizzbuzz(number):
for div_number, substitution in RULES:
if not number % div_number:
return substitution
return str(number)
@pytest.mark.parametrize(
'number, word', [
(1, '1'),
(3, 'Fizz'),
(5, 'Buzz'),
(10, 'Buzz'),
(15, 'FizzBuzz'),
(16, '16')
]
)
def test_fizzbuzz(number, word):
assert fizzbuzz(number) == word

View File

@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
import pytest
@pytest.fixture(params=['apple', 'banana'])
def fruit(request):
return request.param
def test_fruit(fruit):
print('这是我要输入的测试数据:我今天吃的是%s' % fruit)

View File

@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
import pytest
from sushi import Restaurant, Sushi
@pytest.fixture
def fooshi_bar():
"""Returns a Restaurant instance with a great menu."""
return Restaurant(
'Fooshi Bar',
location='Buenos Aires',
menu=[
'Ebi Nigiri',
'Edamame',
'Inarizushi',
'Kappa Maki',
'Miso Soup',
'Sake Nigiri',
'Tamagoyaki',
],
)
@pytest.fixture(scope='session')
def recipes():
"""Return a map from types of sushi to ingredients."""
return {
'California Roll': ['Rice', 'Cucumber', 'Avocado', 'Crab'],
'Ebi Nigiri': ['Shrimp', 'Rice'],
'Inarizushi': ['Fried tofu', 'Rice'],
'Kappa Maki': ['Cucumber', 'Rice', 'Nori'],
'Maguro Nigiri': ['Tuna', 'Rice', 'Nori'],
'Sake Nigiri': ['Salmon', 'Rice', 'Nori'],
'Tamagoyaki': ['Fried egg', 'Rice', 'Nori'],
'Tsunamayo Maki': ['Tuna', 'Mayonnaise'],
}
@pytest.fixture(params=[
'California Roll',
'Ebi Nigiri',
'Inarizushi',
'Kappa Maki',
'Maguro Nigiri',
'Sake Nigiri',
'Tamagoyaki',
'Tsunamayo Maki',
])
def sushi(recipes, request):
"""Create a Sushi instance based on recipes."""
name = request.param
return Sushi(name, ingredients=recipes[name])

View File

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
class Restaurant:
def __init__(self, name, location, menu=None):
if not menu:
raise ValueError
self.name = name
self.location = location
self.menu = menu
class Sushi:
def __init__(self, name, ingredients=None):
if not ingredients:
raise ValueError
self.name = name
self.ingredients = ingredients
def __contains__(self, ingredient):
return ingredient in self.ingredients
@property
def is_vegetarian(self):
for ingredient in ['Crab', 'Salmon', 'Shrimp', 'Tuna']:
if ingredient in self:
return False
return True

View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
import pytest
@pytest.mark.parametrize(
'sushi',
['Kappa Maki', 'Tamagoyaki', 'Inarizushi'],
indirect=True,
)
@pytest.mark.parametrize(
'side_dish',
['Edamame', 'Miso Soup'],
)
def test_fooshi_serves_vegetarian_sushi(fooshi_bar, sushi, side_dish):
assert sushi.is_vegetarian
assert sushi.name in fooshi_bar.menu
assert side_dish in fooshi_bar.menu
def test_sushi(sushi):
assert sushi.name
assert sushi.ingredients

View File

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
import unittest
class Client:
def get(self, url, *args, **kwargs):
# Send a real request based on the given parameters
pass
class TestResponse:
def __init__(self, method, url, *args, **kwargs):
if 'foobar' in url:
self.status = 404
self.reason = 'foobar'
else:
self.status = 200
self.reason = None
class TestClient(Client):
def get(self, url, *args, **kwargs):
return TestResponse('get', url)
class TestScrapingTool(unittest.TestCase):
def setUp(self):
self.client = TestClient()
def test_success(self):
response = self.client.get('https://github.com/pytest-dev')
self.assertEqual(response.status, 200)
self.assertEqual(response.reason, None)
def test_failure(self):
response = self.client.get('foobar')
self.assertEqual(response.status, 404)
self.assertEqual(response.reason, 'foobar')

View File

@ -0,0 +1,19 @@
# Author: lindafang
# Date: 2020-05-03 19:45
# File: test_unittest_mock.py
from unittest import mock
import pytest
config = {"mykey": "ORIGINAL"}
@pytest.fixture(scope="function")
@mock.patch.dict(config, {"mykey": "MOCKED"})
def my_fixture():
return config["mykey"]
def test_foobar(my_fixture):
assert my_fixture == "MOCKED"

3
src/chapter1/__init__.py Normal file
View File

@ -0,0 +1,3 @@
# Author: lindafang
# Date: 2020-04-13 15:11
# File: __init__.py

Binary file not shown.

View File

@ -0,0 +1,20 @@
# Author: lindafang
# File: test_first.py
import pytest
def test_1():
print("\n这是第一个测试方法")
def test_3():
print("\n这是第三个测试方法")
#
# def t_2():
# print("这是第二个测试方法")
if __name__ == "__main__":
pytest.main(["-s", "test_first.py"])

View File

@ -0,0 +1,68 @@
# Author: lindafang
# Date: 2020-04-28 21:38
# File: test_frame.py
import pytest
# 模块中的方法
def setup_module():
print("\nsetup_module整个test_module.py模块只执行一次")
def teardown_module():
print("teardown_module整个test_module.py模块只执行一次")
def setup_function():
print("setup_function每个非类函数测试用例开始前都会执行")
def teardown_function():
print("teardown_function每个非类函数测试用例结束后都会执行")
# 测试模块中的用例1
def test_one():
print("正在执行测试模块----test_one")
def test_one_1():
print("正在执行测试模块----test_one_1")
# 测试模块中的用例2
def test_two():
print("正在执行测试模块----test_two")
# 测试类
class TestCase(object):
def setup_class(self):
print("\nsetup_class在类中所有测试用例执行之前")
def teardown_class(self):
print("teardown_class在类中所有测试用例执行之后")
def setup_method(self):
print("setup_method: 每个类中测试方法用例开始前执行")
def teardown_method(self):
print("teardown_method: 每个类中测试方法用例结束后执行")
def setup(self):
print("setup每个类中测试方法用例开始前都会执行")
def teardown(self):
print("teardown每个类中测试方法用例结束后都会执行")
def test_three(self):
print("正在执行测试类----test_three")
def test_four(self):
print("正在执行测试类----test_four")
if __name__ == "__main__":
pytest.main(["-s", "test_frame.py"])

View File

@ -0,0 +1,36 @@
# Author: lindafang
# Date: 2020-04-28 16:42
# File: test_frame_1.py
import pytest
# 模块中的方法
def setup_module():
print("\nsetup_module整个test_module.py模块只执行一次")
def teardown_module():
print("teardown_module整个test_module.py模块只执行一次")
def setup_function():
print("setup_function每个用例开始前都会执行")
def teardown_function():
print("teardown_function每个用例结束后都会执行")
# 测试模块中的用例1
def test_one():
print("正在执行测试模块----test_one")
# 测试模块中的用例2
def test_two():
print("正在执行测试模块----test_two")
if __name__ == "__main__":
pytest.main(["-s", "test_frame_1.py"])

View File

@ -0,0 +1,36 @@
# Author: lindafang
# Date: 2020-04-28 16:42
# File: test_frame_1.py
import pytest
# 测试类
class TestCase(object):
def setup_class(self):
print("\nsetup_class所有用例执行之前")
def teardown_class(self):
print("teardown_class所有用例执行之后")
def setup_method(self):
print("setup_method: 每个用例开始前执行")
def teardown_method(self):
print("teardown_method: 每个用例结束后执行")
def setup(self):
print("setup每个用例开始前都会执行")
def teardown(self):
print("teardown每个用例结束后都会执行")
def test_three(self):
print("正在执行测试类----test_three")
def test_four(self):
print("正在执行测试类----test_four")
if __name__ == "__main__":
pytest.main(["-s", "test_frame_2.py"])

BIN
src/chapter10appium/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
Pappium-youdao-demo

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="projectConfiguration" value="pytest" />
<option name="PROJECT_TEST_RUNNER" value="pytest" />
</component>
</module>

View File

@ -0,0 +1,52 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<DBN-PSQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false" />
</DBN-PSQL>
<DBN-SQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false">
<option name="STATEMENT_SPACING" value="one_line" />
<option name="CLAUSE_CHOP_DOWN" value="chop_down_if_statement_long" />
<option name="ITERATION_ELEMENTS_WRAPPING" value="chop_down_if_not_single" />
</formatting-settings>
</DBN-SQL>
<DBN-PSQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false" />
</DBN-PSQL>
<DBN-SQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false">
<option name="STATEMENT_SPACING" value="one_line" />
<option name="CLAUSE_CHOP_DOWN" value="chop_down_if_statement_long" />
<option name="ITERATION_ELEMENTS_WRAPPING" value="chop_down_if_not_single" />
</formatting-settings>
</DBN-SQL>
</code_scheme>
</component>

View File

@ -0,0 +1,455 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DataEditorManager">
<record-view-column-sorting-type value="BY_INDEX" />
<value-preview-text-wrapping value="true" />
<value-preview-pinned value="false" />
</component>
<component name="DBNavigator.Project.DataExportManager">
<export-instructions>
<create-header value="true" />
<quote-values-containing-separator value="true" />
<quote-all-values value="false" />
<value-separator value="" />
<file-name value="" />
<file-location value="" />
<scope value="GLOBAL" />
<destination value="FILE" />
<format value="EXCEL" />
<charset value="UTF-8" />
</export-instructions>
</component>
<component name="DBNavigator.Project.DatabaseBrowserManager">
<autoscroll-to-editor value="false" />
<autoscroll-from-editor value="true" />
<show-object-properties value="true" />
<loaded-nodes />
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.EditorStateManager">
<last-used-providers />
</component>
<component name="DBNavigator.Project.MethodExecutionManager">
<method-browser />
<execution-history>
<group-entries value="true" />
<execution-inputs />
</execution-history>
<argument-values-cache />
</component>
<component name="DBNavigator.Project.ObjectDependencyManager">
<last-used-dependency-type value="INCOMING" />
</component>
<component name="DBNavigator.Project.ObjectQuickFilterManager">
<last-used-operator value="EQUAL" />
<filters />
</component>
<component name="DBNavigator.Project.ScriptExecutionManager" clear-outputs="true">
<recently-used-interfaces />
</component>
<component name="DBNavigator.Project.Settings">
<connections />
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="NESTED TABLE" enabled="false" />
<object-type name="COLUMN" enabled="false" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE ATTRIBUTE" enabled="false" />
<object-type name="ARGUMENT" enabled="false" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="true" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<tracking-columns>
<columnNames value="" />
<visible value="true" />
<editable value="false" />
</tracking-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="Properties" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="YAML" enabled="true" />
<content-type name="Bash" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
<debugger>
<debugger-type value="JDBC" />
<use-generic-runners value="true" />
</debugger>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
<component name="DBNavigator.Project.StatementExecutionManager">
<execution-variables />
</component>
</project>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6" project-jdk-type="Python SDK" />
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/../Pappium-youdao-demo/.idea/Pappium-youdao-demo.iml" filepath="$PROJECT_DIR$/../Pappium-youdao-demo/.idea/Pappium-youdao-demo.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
title,text
我的日记1,this is my first note.
我的日记2, today is holiday.
1 title text
2 我的日记1 this is my first note.
3 我的日记2 today is holiday.

View File

@ -0,0 +1,3 @@
- titlename
- mydaily
- 我的日记

View File

@ -0,0 +1,3 @@
# Author: lindafang
# Date: 2020-08-13 11:13
# File: __init__.py.py

View File

@ -0,0 +1 @@
base_url: http://127.0.0.1:4723/wd/hub

View File

@ -0,0 +1,3 @@
# Author: lindafang
# Date: 2020-08-12 09:19
# File: __init__.py.py

View File

@ -0,0 +1,27 @@
# Author: lindafang
# Date: 2020-08-14 11:28
# File: test_data_drvien.py
import pytest
from utils.get_csvdata import get_csv_data
from utils.get_path import PATH
datafile = PATH("../Testdatas/addnotedata.csv")
data_test = get_csv_data(datafile)
@pytest.fixture(autouse=True)
def data_addnote(*data_test):
# print("这是",data_test)
print(type(data_test))
return data_test
@pytest.mark.parametrize("title,text", data_addnote)
def test_param(title, text):
print(title, "----")
print(text, "---")
if __name__ == '__main__':
pytest.main()

View File

@ -0,0 +1,41 @@
from appium import webdriver
from utils import desired_caps
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps.get_desired_caps())
# 进入时点的同意
el1 = driver.find_element_by_id("btn_ok")
# com.youdao.note:id/btn_ok
el1.click()
# time.sleep(2)
# driver.find_element_by_id("com.youdao.note:id/btn_ok").click()
#
# time.sleep(2)
# # 权限允许
# el2=driver.find_element_by_id("com.android.packageinstaller:id/permission_allow_button")
# el2.click()
# if el2 is not None:
# el2.click()
# time.sleep(3)
# el3 = driver.find_element_by_id("com.youdao.note:id/add_note")
# el3.click()
# time.sleep(2)
# el4 = driver.find_element_by_id("com.youdao.note:id/add_icon")
# el4.click()
# time.sleep(3)
# # driver.back()
# el5 = driver.find_element_by_id("com.youdao.note:id/note_title")
# el5.send_keys("这是我的日志")
# time.sleep(5)
#
# # driver.press_keycode(66)
# # time.sleep(1)
# driver.find_elements_by_xpath('//android.widget.LinearLayout[@resourceid="com.youdao.note:id/note_content"]')[1].send_keys('七点半签到')
# time.sleep(3)
#
# el9 = driver.find_element_by_id("com.youdao.note:id/actionbar_complete_text")
# el9.click()
#
# driver.reset()

View File

@ -0,0 +1,39 @@
# Author: lindafang
# Date: 2020-08-12 09:20
# File: test_youdao_start.py
'''
1连接手机手机相关配置启动手机app.
2使用webdriver简单定位进行操作
'''
from utils.get_path import PATH
app_file = PATH("../Papp/ApiDemos-debug.apk")
print(app_file)
# desired_caps={
# "platformName":"android",
# # 在cmd使用adb devices返回的值写在下面
# "deviceName":"emulator-5554",
# # 这个是夜神的设备名
# # "deviceName":"127.0.0.1:62001",
# "platformVersion":"6.0",
# # 你夜神的android版本
# # "platformVersion":"5.1",
# "automationName":"UiAutomator2",
# # 值 是你app的地址
# "app":app_file,
#
# }
#
#
#
# driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
# el1 = driver.find_element_by_accessibility_id("Accessibility")
# el1.get_attribute("context-desc")
# el1.click()
# el2 = driver.find_element_by_accessibility_id("Accessibility Node Querying")
# el2.click()
# el3 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.ListView/android.widget.LinearLayout[3]/android.widget.CheckBox")
# el3.click()
# driver.save_screenshot("1.png")

View File

@ -0,0 +1,3 @@
# Author: lindafang
# Date: 2020-08-13 11:12
# File: __init__.py.py

View File

@ -0,0 +1,25 @@
# Author: lindafang
# Date: 2020-08-13 11:36
# File: addnotepage.py
from .basepage import BasePage
from .locators import AddNotePageLoacators
from .locators import FirstOpenPageLocators
class FirstOpenPage(BasePage):
# 继承的BasePage是我的父类父类中的所有方法我都能用。
def permission_allowandok(self):
BasePage.click_thing(self, FirstOpenPageLocators.btn_ok)
BasePage.click_thing(self, FirstOpenPageLocators.btn_ok)
BasePage.click_thing(self, FirstOpenPageLocators.permission_allow)
class AddNotePage(BasePage):
def add_note_ok(self, title):
BasePage.click_thing(self, AddNotePageLoacators.add_note)
BasePage.click_thing(self, AddNotePageLoacators.add_icon)
BasePage.set_value(self, AddNotePageLoacators.note_title, title)
# self.driver.press_keycode(66)
# BasePage.set_value(self, AddNotePageLoacators.note_editText, editText)
BasePage.click_thing(self, AddNotePageLoacators.submit_complete)

View File

@ -0,0 +1,68 @@
# Author: lindafang
# Date: 2020-08-13 11:27
# File: basepage.py
import logging
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
log = logging.getLogger("linda's test")
class BasePage(object):
def __init__(self, driver):
# init
# self
# 设置driver的类型,所有方法在没有实例时才能点出来
self.driver: WebDriver = driver
log.info("这是个初始化驱动!")
def set_value(self, locator, value):
if (WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located(locator)
)):
# 参数传递,元组格式与非元组格式
element = self.driver.find_element(*locator)
element.click()
element.clear()
element.send_keys(value)
else:
log.error("无法输入信息,找不到元素")
def click_thing(self, locator):
if (WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located(locator)
)):
element = self.driver.find_element(*locator)
element.click()
else:
log.error("无法点击,找不到元素")
def save_pic(self, filepath):
self.driver.get_screenshot_as_file(filepath)
def swipe_up(self, driver):
# 兼容性-适合所有手机,获得屏幕大小--宽,高
width = driver.get_window_size()['width']
height = driver.get_window_size()['height']
# swipex=起始点x坐标y=起始点y的坐标x1=滑动到的点的x坐标y1=滑动到的点的y坐标
# 00的点是在屏幕左上角。
self.driver.swipe(width / 2, height / 3 * 2, width / 2, height / 3 * 1)
def swipe_down(self, driver):
width = driver.get_window_size()['width']
height = driver.get_window_size()['height']
self.driver.swipe(width / 2, height / 3, width / 2, height / 3 * 2)
def swipe_right(self, driver):
width = driver.get_window_size()['width']
height = driver.get_window_size()['height']
self.driver.swipe(width / 10, height / 2, width / 10 * 9, height / 2)
def swipe_left(self, driver):
width = driver.get_window_size()['width']
height = driver.get_window_size()['height']
self.driver.swipe(width / 10 * 9, height / 2, width / 10, height / 2)

View File

@ -0,0 +1,21 @@
# Author: lindafang
# Date: 2020-08-13 11:23
# File: locators.py
from appium.webdriver.common.mobileby import MobileBy
class FirstOpenPageLocators(object):
btn_ok = (MobileBy.ID, "com.youdao.note:id/btn_ok")
permission_allow = (MobileBy.ID, "com.android.packageinstaller:id/permission_allow_button")
class AddNotePageLoacators(object):
add_note = (MobileBy.ID, "com.youdao.note:id/add_note")
add_icon = (MobileBy.ID, "com.youdao.note:id/add_icon")
note_title = (MobileBy.ID, "com.youdao.note:id/note_title")
# note_editText = (MobileBy.XPATH, "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.ScrollView/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.EditText")
# /hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.ScrollView/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.EditText
# // android.widget.EditText
note_editText = (MobileBy.XPATH, "//android.widget.EditText")
submit_complete = (MobileBy.ID, "com.youdao.note:id/actionbar_complete_text")

View File

@ -0,0 +1,9 @@
[pytest]
markers =
regression
sanity
log_cli = 1
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
log_cli_date_format = %Y-%m-%d %H:%M:%S

View File

@ -0,0 +1,81 @@
{
"name": "test_addnote[titlename]",
"status": "passed",
"steps": [
{
"name": "初始化添加页面",
"status": "passed",
"start": 1605246234664,
"stop": 1605246234664
}
],
"attachments": [
{
"name": "log",
"source": "2b791e82-6b09-43b9-a2b0-0eee6940d2be-attachment.txt",
"type": "text/plain"
}
],
"parameters": [
{
"name": "add",
"value": "'titlename'"
}
],
"start": 1605246234664,
"stop": 1605246243327,
"uuid": "e980355b-ef95-4b6b-aeb8-f6181bc9331e",
"historyId": "08c83c542e7f539f428476244e3617e1",
"testCaseId": "8db33a95bdc54014b9ea1036d3f6a2a7",
"fullName": "testcases.test_add_note_pytest.TestNotePytest#test_addnote",
"labels": [
{
"name": "feature",
"value": "笔记功能"
},
{
"name": "story",
"value": "添加笔记功能"
},
{
"name": "severity",
"value": "critical"
},
{
"name": "tag",
"value": "regression"
},
{
"name": "parentSuite",
"value": "testcases"
},
{
"name": "suite",
"value": "test_add_note_pytest"
},
{
"name": "subSuite",
"value": "TestNotePytest"
},
{
"name": "host",
"value": "cpe-172-115-250-122.socal.res.rr.com"
},
{
"name": "thread",
"value": "7020-MainThread"
},
{
"name": "framework",
"value": "pytest"
},
{
"name": "language",
"value": "cpython3"
},
{
"name": "package",
"value": "testcases.test_add_note_pytest"
}
]
}

View File

@ -0,0 +1,19 @@
{
"uuid": "6af5198a-4b32-4ed1-a49a-328e93e6c547",
"children": [
"e980355b-ef95-4b6b-aeb8-f6181bc9331e",
"932f4547-1f00-4527-a0ad-998e2cbe2673",
"ce01012d-2140-458b-a97c-f77dc84502a5",
"91aa413c-8e34-43d9-9953-5afb870b11dd"
],
"befores": [
{
"name": "base_url",
"status": "passed",
"start": 1605246224382,
"stop": 1605246224382
}
],
"start": 1605246224382,
"stop": 1605246257547
}

View File

@ -0,0 +1,19 @@
{
"uuid": "bd510ca4-b7dd-41fc-86b0-5efdb63d06e3",
"children": [
"e980355b-ef95-4b6b-aeb8-f6181bc9331e",
"932f4547-1f00-4527-a0ad-998e2cbe2673",
"ce01012d-2140-458b-a97c-f77dc84502a5",
"91aa413c-8e34-43d9-9953-5afb870b11dd"
],
"befores": [
{
"name": "sensitive_url",
"status": "passed",
"start": 1605246232886,
"stop": 1605246232886
}
],
"start": 1605246232886,
"stop": 1605246257545
}

View File

@ -0,0 +1,16 @@
{
"uuid": "ab21421a-098d-44d6-93bb-eee0ca2d83a7",
"children": [
"e980355b-ef95-4b6b-aeb8-f6181bc9331e"
],
"befores": [
{
"name": "_skip_sensitive",
"status": "passed",
"start": 1605246234663,
"stop": 1605246234663
}
],
"start": 1605246234663,
"stop": 1605246243328
}

View File

@ -0,0 +1,2 @@
INFO  linda's test:basepage.py:22 这是个初始化驱动!
INFO  linda's test:basepage.py:22 这是个初始化驱动!

View File

@ -0,0 +1,81 @@
{
"name": "test_addnote[我的日记]",
"status": "passed",
"steps": [
{
"name": "初始化添加页面",
"status": "passed",
"start": 1605246251075,
"stop": 1605246251075
}
],
"attachments": [
{
"name": "log",
"source": "eeea85be-6a8d-4746-b9a8-d80b5ebfda0f-attachment.txt",
"type": "text/plain"
}
],
"parameters": [
{
"name": "add",
"value": "'我的日记'"
}
],
"start": 1605246251075,
"stop": 1605246256942,
"uuid": "ce01012d-2140-458b-a97c-f77dc84502a5",
"historyId": "c3dadac8012ca3b0e11d3abb7b964158",
"testCaseId": "8db33a95bdc54014b9ea1036d3f6a2a7",
"fullName": "testcases.test_add_note_pytest.TestNotePytest#test_addnote",
"labels": [
{
"name": "feature",
"value": "笔记功能"
},
{
"name": "story",
"value": "添加笔记功能"
},
{
"name": "severity",
"value": "critical"
},
{
"name": "tag",
"value": "regression"
},
{
"name": "parentSuite",
"value": "testcases"
},
{
"name": "suite",
"value": "test_add_note_pytest"
},
{
"name": "subSuite",
"value": "TestNotePytest"
},
{
"name": "host",
"value": "cpe-172-115-250-122.socal.res.rr.com"
},
{
"name": "thread",
"value": "7020-MainThread"
},
{
"name": "framework",
"value": "pytest"
},
{
"name": "language",
"value": "cpython3"
},
{
"name": "package",
"value": "testcases.test_add_note_pytest"
}
]
}

View File

@ -0,0 +1,81 @@
{
"name": "test_addnote[mydaily]",
"status": "passed",
"steps": [
{
"name": "初始化添加页面",
"status": "passed",
"start": 1605246243331,
"stop": 1605246243331
}
],
"attachments": [
{
"name": "log",
"source": "929d0d94-ab92-4aa4-bcb1-9a1109957415-attachment.txt",
"type": "text/plain"
}
],
"parameters": [
{
"name": "add",
"value": "'mydaily'"
}
],
"start": 1605246243331,
"stop": 1605246251070,
"uuid": "932f4547-1f00-4527-a0ad-998e2cbe2673",
"historyId": "334b8cf0229187da0114e758a97ae5d6",
"testCaseId": "8db33a95bdc54014b9ea1036d3f6a2a7",
"fullName": "testcases.test_add_note_pytest.TestNotePytest#test_addnote",
"labels": [
{
"name": "feature",
"value": "笔记功能"
},
{
"name": "story",
"value": "添加笔记功能"
},
{
"name": "severity",
"value": "critical"
},
{
"name": "tag",
"value": "regression"
},
{
"name": "parentSuite",
"value": "testcases"
},
{
"name": "suite",
"value": "test_add_note_pytest"
},
{
"name": "subSuite",
"value": "TestNotePytest"
},
{
"name": "host",
"value": "cpe-172-115-250-122.socal.res.rr.com"
},
{
"name": "thread",
"value": "7020-MainThread"
},
{
"name": "framework",
"value": "pytest"
},
{
"name": "language",
"value": "cpython3"
},
{
"name": "package",
"value": "testcases.test_add_note_pytest"
}
]
}

View File

@ -0,0 +1,13 @@
{
"uuid": "c9f3b0b4-2ec7-4afc-a304-6e857432dc38",
"befores": [
{
"name": "add",
"status": "passed",
"start": 1605246243331,
"stop": 1605246243331
}
],
"start": 1605246243331,
"stop": 1605246251071
}

View File

@ -0,0 +1,16 @@
{
"uuid": "ff8441f3-8417-48e9-b01c-c384b71c8700",
"children": [
"932f4547-1f00-4527-a0ad-998e2cbe2673"
],
"befores": [
{
"name": "_skip_sensitive",
"status": "passed",
"start": 1605246243330,
"stop": 1605246243331
}
],
"start": 1605246243330,
"stop": 1605246251071
}

View File

@ -0,0 +1 @@
INFO  linda's test:basepage.py:22 这是个初始化驱动!

View File

@ -0,0 +1,27 @@
{
"uuid": "c46fc8fd-34b6-45d3-8870-848aa6b8dbbc",
"children": [
"e980355b-ef95-4b6b-aeb8-f6181bc9331e",
"932f4547-1f00-4527-a0ad-998e2cbe2673",
"ce01012d-2140-458b-a97c-f77dc84502a5",
"91aa413c-8e34-43d9-9953-5afb870b11dd"
],
"befores": [
{
"name": "run_app",
"status": "passed",
"start": 1605246224383,
"stop": 1605246232885
}
],
"afters": [
{
"name": "run_app::close_app",
"status": "passed",
"start": 1605246256948,
"stop": 1605246257544
}
],
"start": 1605246224383,
"stop": 1605246257544
}

View File

@ -0,0 +1,52 @@
{
"name": "test_deletenote",
"status": "passed",
"start": 1605246256946,
"stop": 1605246256946,
"uuid": "91aa413c-8e34-43d9-9953-5afb870b11dd",
"historyId": "e314ff1939927dfbdf68c324dbe84599",
"testCaseId": "e22a501644a708de344509cdcb40311a",
"fullName": "testcases.test_add_note_pytest.TestNotePytest#test_deletenote",
"labels": [
{
"name": "feature",
"value": "笔记功能"
},
{
"name": "tag",
"value": "sanity"
},
{
"name": "parentSuite",
"value": "testcases"
},
{
"name": "suite",
"value": "test_add_note_pytest"
},
{
"name": "subSuite",
"value": "TestNotePytest"
},
{
"name": "host",
"value": "cpe-172-115-250-122.socal.res.rr.com"
},
{
"name": "thread",
"value": "7020-MainThread"
},
{
"name": "framework",
"value": "pytest"
},
{
"name": "language",
"value": "cpython3"
},
{
"name": "package",
"value": "testcases.test_add_note_pytest"
}
]
}

View File

@ -0,0 +1,13 @@
{
"uuid": "4ed3e9e2-2391-45c6-8aba-9bdade7d6019",
"befores": [
{
"name": "add",
"status": "passed",
"start": 1605246234663,
"stop": 1605246234663
}
],
"start": 1605246234663,
"stop": 1605246243327
}

View File

@ -0,0 +1,19 @@
{
"uuid": "4b5061e6-a718-44a1-bcd2-6f9b7bb52f5e",
"children": [
"e980355b-ef95-4b6b-aeb8-f6181bc9331e",
"932f4547-1f00-4527-a0ad-998e2cbe2673",
"ce01012d-2140-458b-a97c-f77dc84502a5",
"91aa413c-8e34-43d9-9953-5afb870b11dd"
],
"befores": [
{
"name": "agree_init",
"status": "passed",
"start": 1605246232886,
"stop": 1605246234663
}
],
"start": 1605246232886,
"stop": 1605246256947
}

View File

@ -0,0 +1,16 @@
{
"uuid": "e77dd35f-5fd5-4521-b0ab-a4fd5e6ec090",
"children": [
"91aa413c-8e34-43d9-9953-5afb870b11dd"
],
"befores": [
{
"name": "_skip_sensitive",
"status": "passed",
"start": 1605246256946,
"stop": 1605246256946
}
],
"start": 1605246256945,
"stop": 1605246256946
}

View File

@ -0,0 +1,19 @@
{
"uuid": "7dce7389-7b0e-4d16-a373-c01cd539b2ea",
"children": [
"e980355b-ef95-4b6b-aeb8-f6181bc9331e",
"932f4547-1f00-4527-a0ad-998e2cbe2673",
"ce01012d-2140-458b-a97c-f77dc84502a5",
"91aa413c-8e34-43d9-9953-5afb870b11dd"
],
"befores": [
{
"name": "_verify_url",
"status": "passed",
"start": 1605246224383,
"stop": 1605246224383
}
],
"start": 1605246224383,
"stop": 1605246257546
}

View File

@ -0,0 +1 @@
INFO  linda's test:basepage.py:22 这是个初始化驱动!

View File

@ -0,0 +1,13 @@
{
"uuid": "405f9e2d-01f6-4302-aafd-ab6eb4dfb000",
"befores": [
{
"name": "add",
"status": "passed",
"start": 1605246251074,
"stop": 1605246251074
}
],
"start": 1605246251074,
"stop": 1605246256942
}

View File

@ -0,0 +1,16 @@
{
"uuid": "30fc52eb-81b3-4005-9ce8-7dbcbe894eca",
"children": [
"ce01012d-2140-458b-a97c-f77dc84502a5"
],
"befores": [
{
"name": "_skip_sensitive",
"status": "passed",
"start": 1605246251074,
"stop": 1605246251074
}
],
"start": 1605246251074,
"stop": 1605246256943
}

Binary file not shown.

View File

@ -0,0 +1,3 @@
# Author: lindafang
# Date: 2020-08-13 11:12
# File: __init__.py.py

View File

@ -0,0 +1,22 @@
# Author: lindafang
# Date: 2020-08-14 08:57
# File: conftest.py
import pytest
from appium import webdriver
from utils import desired_caps
# 在哪个包下,这个包下所有文件共享的数据写在这里
from utils.get_path import PATH
from utils.get_yaml import get_yaml_data
@pytest.fixture(scope='session')
def run_app(request):
desired_cap_value = desired_caps.get_desired_caps()
driver = webdriver.Remote(get_yaml_data(PATH("../config/conf.yaml"))['base_url'], desired_cap_value)
def close_app():
driver.quit()
request.addfinalizer(close_app)
return driver

View File

@ -0,0 +1,62 @@
# Author: lindafang
# Date: 2020-08-13 11:55
# File: test_add_note.py
import unittest
from datetime import datetime
from appium import webdriver
from ddt import ddt, data
from pageobject import addnotepage
from utils import desired_caps
from utils.get_csvdata import get_csv_data
from utils.get_path import PATH
@ddt
class TestNote(unittest.TestCase):
datafile = PATH("../Testdatas/addnotedata.csv")
print(datafile)
@classmethod
def setUpClass(cls):
desired_cap_value = desired_caps.get_desired_caps()
cls.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_cap_value)
# 先初始化页面,
ok = addnotepage.FirstOpenPage(cls.driver)
# 操作的方法
ok.permission_allowandok()
@classmethod
def tearDownClass(cls):
# 关闭app
cls.driver.quit()
# def test_addNote_nodate(self):
# # 初始化添加笔记页面
# add_note=addnotepage.AddNotePage(self.driver)
# add_note.save_pic("/Users/lindafang/PycharmProjects/Pappium-youdao-demo/shotpicture/"+str(datetime.now()) + "addnote.png")
# add_note.add_note_ok("这是笔记的标题","我今天很开心,跟大家共同渡过!")
@data(*get_csv_data(datafile))
def test_addNote(self, value):
daily_title = value[0]
daily_text = value[1]
# 先初始化添加日记的页面
addnote = addnotepage.AddNotePage(self.driver)
addnote.add_note_ok(daily_title, daily_text)
addnote.save_pic(PATH("../shotpicture/" + str(datetime.now())) + "addnote.png")
# 这里少断言先在页面找到要断言的元素在locator中加入元素。
# 在封装的方法中加入属性值 的获取,在这里加断言
assert 1
def test_edit_note(self):
pass
def test_delete_note(self):
pass
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1,47 @@
# Author: lindafang
# Date: 2020-08-14 08:55
# File: test_add_note_pytest.py
from datetime import datetime
import allure
import pytest
import yaml
from pageobject import addnotepage
from utils.get_path import PATH
@allure.feature("笔记功能")
class TestNotePytest(object):
@allure.step("初始化,打开手机,同意权限")
@pytest.fixture(scope='module', autouse=True)
def agree_init(self, run_app):
# 初始化driver文件级通用
# 先初始化页面,
ok = addnotepage.FirstOpenPage(run_app)
# 操作的方法
ok.permission_allowandok()
@allure.story("添加笔记功能")
@pytest.mark.regression
@allure.severity("critical")
@pytest.mark.parametrize("add",
yaml.safe_load(open(PATH("../Testdatas/" + "addnotedata.yaml"), 'r', encoding='utf8')))
def test_addnote(self, add, run_app):
note_title = add
# 初始化添加笔记页
with allure.step("初始化添加页面"):
addnote = addnotepage.AddNotePage(run_app)
# # 添加标题和内容
addnote.add_note_ok(note_title)
# # 截图
addnote.save_pic(PATH("../shotpicture/" + str(datetime.now())) + "addnote.png")
@pytest.mark.sanity
# @pytest.mark.skip
def test_deletenote(self):
pass
if __name__ == '__main__':
pytest.main()

Some files were not shown because too many files have changed in this diff Show More