docs: add development guide

add development guide

Change-Id: Id8fcac77eb5691e297f99cfe845c1b53bf1709bf
This commit is contained in:
yangshaoxue 2022-09-08 18:12:07 +08:00
parent 2f4eb2d36b
commit c069ce5aaf
4 changed files with 624 additions and 151 deletions

View File

@ -1,2 +1,346 @@
Catalog Introduction
~~~~~~~~~~~~~~~~~~~~
Introduction to the first-level directory
-----------------------------------------
- :guilabel:`Gruntfile.js`: Used to collect i18n
- :guilabel:`LICENSE`: This project uses Apache License
- :guilabel:`Makefile`
- :guilabel:`README.rst`: A brief description of the front-end startup,
please refer to the docs for details
- :guilabel:`config`: webpack configuration, which contains webpack
configuration in public, development environment, test environment,
and build environment
- :guilabel:`cypress.json`: E2E test configuration file
- :guilabel:`docker`: Contains the docker configuration used in the
development environment, generation environment, and test environment
- :guilabel:`docs`: Documentation introduction, including Chinese, English,
development documentation, testing documentation
- :guilabel:`jest.config.js`: Unit test configuration file
- :guilabel:`jsconfig.json`: javascript code configuration file
- :guilabel:`package.json`: Configuration files such as installation
packages and commands
- :guilabel:`yarn.lock`: The version lock file of the package
- :guilabel:`.babelrc`: Babel configuration file
- :guilabel:`.dockerignore`: File configuration ignored by docker
- :guilabel:`.eslintignore`: File configuration ignored by eslint
- :guilabel:`.eslint`: Eslint configuration
- :guilabel:`.gitignore`: File configuration ignored by git
- :guilabel:`.gitreview`: Gitreview configuration
- :guilabel:`.prettierignore`: File configuration ignored by prettier
- :guilabel:`.prettierrc`: Prettier configuration
- :guilabel:`src`: **The folder where the development code is located**
- :guilabel:`test`: **The folder where the test code is located,
contains e2e test code and basic code for unit testing**
- :guilabel:`tools`: Other tools folder, containing git tools
Catalog Introduction-Image Version
-----------------------------------
.. code-block:: text
.
├── Gruntfile.js (Used to collect i18n)
├── LICENSE
├── Makefile
├── README.rst
├── config
│   ├── theme.js
│   ├── webpack.common.js
│   ├── webpack.dev.js (Webpack configuration used during development)
│   ├── webpack.e2e.js (The webpack configuration used during e2e testing can generate a package for testing coverage)
│   └── webpack.prod.js (Webpack packaging configuration used by the generation environment)
├── cypress.json (E2E configuration)
├── docker
│   ├── dev.dockerfile
│   ├── nginx.conf
│   ├── prod.dockerfile
│   └── test.dockerfile
├── docs (Documents)
├── jest.config.js (Unit testing configuration)
├── jsconfig.json
├── package.json
├── src
│   ├── api (Api summary, not used yet)
│   ├── asset
│   │   ├── image (Images placement)
│   │   └── template
│   │   └── index.html
│   ├── components (Public components)
│   ├── containers
│   │   ├── Action
│   │   │   ├── ConfirmAction (Confirmed action base class)
│   │   │   ├── FormAction (Single page action base class)
│   │   │   ├── ModalAction (Pop-up action base class)
│   │   │   ├── StepAction (Multi-step single-page action, for example: create a cloud host)
│   │   │   └── index.jsx
│   │   ├── BaseDetail (Detail page base class with detailed information)
│   │   ├── List (The base class of the list page, for example: cloud host)
│   │   ├── TabDetail (The base class of the detail page with tab switching, for example: instance details)
│   │   └── TabList (List page with tab switch)
│   ├── core
│   │   ├── App.jsx
│   │   ├── i18n.js
│   │   ├── index.jsx (Entry)
│   │   └── routes.js (Routing configuration by module)
│   ├── layouts
│   │   ├── Base (Layout used after login)
│   │   ├── Blank (Blank layout)
│   │   ├── User (Layout used for login)
│   │   ├── admin-menu.jsx (Menu configuration used by the management platform)
│   │   └── menu.jsx (Menu configuration used by the console)
│   ├── locales (Translation)
│   │   ├── en.json
│   │   ├── index.js
│   │   └── zh.json
│   ├── pages (The page-directory structure is assigned according to: menu item-secondary menu, where the pages of the secondary menu are placed in the containers folder)
│   │   ├── base
│   │   │   ├── App.jsx
│   │   │   ├── containers
│   │   │   │   ├── 404 (404 page)
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── AdminOverview (Management platform home page)
│   │   │   │   │   ├── components
│   │   │   │   │   │   ├── ComputeService.jsx
│   │   │   │   │   │   ├── NetworkService.jsx
│   │   │   │   │   │   ├── PlatformInfo.jsx
│   │   │   │   │   │   ├── ResourceOverview.jsx
│   │   │   │   │   │   └── VirtualResource.jsx
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── style.less
│   │   │   │   └── Overview (Console home page)
│   │   │   │   ├── components
│   │   │   │   │   ├── ProjectInfo.jsx
│   │   │   │   │   ├── QuotaOverview.jsx
│   │   │   │   │   └── ResourceStatistic.jsx
│   │   │   │   ├── index.jsx
│   │   │   │   └── style.less
│   │   │   └── routes (Routing configuration)
│   │   │   └── index.js
│   │   ├── compute
│   │   │   ├── App.jsx
│   │   │   ├── containers
│   │   │   │   ├── BareMetalNode (Bare metal configuration)
│   │   │   │   ├── Flavor (Instance type)
│   │   │   │   ├── HostAggregate (Host Aggregate)
│   │   │   │   │   ├── Aggregate (Host Aggregate)
│   │   │   │   │   ├── AvailabilityZone (Availability zone)
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Hypervisors (Hypervisors management)
│   │   │   │   │   ├── ComputeHost (Compute host)
│   │   │   │   │   ├── Hypervisor (Hypervisor manager)
│   │   │   │   │   └── index.jsx
│   │   │   │   ├── Image (Image)
│   │   │   │   ├── Instance (Instance)
│   │   │   │   │   ├── Detail (Detail page)
│   │   │   │   │   │   ├── BaseDetail (Base info)
│   │   │   │   │   │   ├── SecurityGroup (Security group)
│   │   │   │   │   │   └── index.jsx
│   │   │   │   │   ├── actions (Actions)
│   │   │   │   │   │   ├── AssociateFip.jsx (Associate fip ip)
│   │   │   │   │   │   ├── AttachInterface.jsx (Attach interface)
│   │   │   │   │   │   ├── AttachIsoVolume.jsx (Attach iso volume)
│   │   │   │   │   │   ├── AttachVolume.jsx (Attach volume)
│   │   │   │   │   │   ├── ChangePassword.jsx (Change password)
│   │   │   │   │   │   ├── Console.jsx (Console)
│   │   │   │   │   │   ├── CreateImage.jsx (Create Image)
│   │   │   │   │   │   ├── CreateIronic (Create ironic-Step-by-step Form)
│   │   │   │   │   │   │   ├── BaseStep
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── ConfirmStep
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── NetworkStep
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── SystemStep
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   └── index.less
│   │   │   │   │   │   ├── CreateSnapshot.jsx (Create snapshot)
│   │   │   │   │   │   ├── Delete.jsx (Delete instance)
│   │   │   │   │   │   ├── DeleteIronic.jsx (Delete ironic)
│   │   │   │   │   │   ├── DetachInterface.jsx (Detach interface)
│   │   │   │   │   │   ├── DetachIsoVolume.jsx (Detach iso volume)
│   │   │   │   │   │   ├── DetachVolume.jsx (Detach volume)
│   │   │   │   │   │   ├── DisassociateFip.jsx (Disassociate fip iP)
│   │   │   │   │   │   ├── Edit.jsx (Edit instance)
│   │   │   │   │   │   ├── ExtendRootVolume.jsx (Expand the root disk)
│   │   │   │   │   │   ├── LiveMigrate.jsx (Live migrate)
│   │   │   │   │   │   ├── Lock.jsx (Lock instance)
│   │   │   │   │   │   ├── ManageSecurityGroup.jsx (Manage security group)
│   │   │   │   │   │   ├── Migrate.jsx (Migrate)
│   │   │   │   │   │   ├── Pause.jsx (Pause instance)
│   │   │   │   │   │   ├── Reboot.jsx (Reboot instance)
│   │   │   │   │   │   ├── Rebuild.jsx (Rebuild instance)
│   │   │   │   │   │   ├── RebuildSelect.jsx (Select the image to rebuild the instance)
│   │   │   │   │   │   ├── Resize.jsx (Change configuration)
│   │   │   │   │   │   ├── ResizeOnline.jsx (Modify configuration online)
│   │   │   │   │   │   ├── Resume.jsx (Resume instance)
│   │   │   │   │   │   ├── Shelve.jsx (Shelve instance)
│   │   │   │   │   │   ├── SoftDelete.jsx (Soft delete instance)
│   │   │   │   │   │   ├── SoftReboot.jsx (Soft reboot instance)
│   │   │   │   │   │   ├── Start.jsx (Start instance)
│   │   │   │   │   │   ├── StepCreate (Create a instance-step by step creation)
│   │   │   │   │   │   │   ├── BaseStep
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── ConfirmStep
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── NetworkStep
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── SystemStep
│   │   │   │   │   │   │   │   └── index.jsx
│   │   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   │   └── index.less
│   │   │   │   │   │   ├── Stop.jsx (Stop instance)
│   │   │   │   │   │   ├── Suspend.jsx (Suspend instance)
│   │   │   │   │   │   ├── Unlock.jsx (Unlock instance)
│   │   │   │   │   │   ├── Unpause.jsx (Unpause instance)
│   │   │   │   │   │   ├── Unshelve.jsx (Unshelve instance)
│   │   │   │   │   │   ├── index.jsx
│   │   │   │   │   │   └── index.less
│   │   │   │   │   ├── components (Component)
│   │   │   │   │   │   ├── FlavorSelectTable.jsx
│   │   │   │   │   │   └── index.less
│   │   │   │   │   ├── index.jsx
│   │   │   │   │   └── index.less
│   │   │   │   ├── Keypair (Key pair)
│   │   │   │   └── ServerGroup (Instance group)
│   │   │   └── routes (Routing configuration under the compute menu)
│   │   │   └── index.js
│   │   ├── configuration (Platform configuration)
│   │   │   ├── App.jsx
│   │   │   ├── containers
│   │   │   │   ├── Metadata (Metadata definition)
│   │   │   │   ├── Setting (System configuration)
│   │   │   │   └── SystemInfo (System info)
│   │   │   └── routes (Routing configuration under the platform configuration menu)
│   │   │   └── index.js
│   │   ├── heat (Resource orchestration)
│   │   │   ├── App.jsx
│   │   │   ├── containers
│   │   │   │   └── Stack (Stack)
│   │   │   └── routes (Routing configuration under the resource arrangement menu)
│   │   │   └── index.js
│   │   ├── identity (Identity management)
│   │   │   ├── App.jsx
│   │   │   ├── containers
│   │   │   │   ├── Domain (Domain)
│   │   │   │   ├── Project (Project)
│   │   │   │   ├── Role (Role)
│   │   │   │   ├── User (User)
│   │   │   │   └── UserGroup (User group)
│   │   │   └── routes (Routing configuration)
│   │   │   └── index.js
│   │   ├── management (Operation and maintenance management)
│   │   │   ├── App.jsx
│   │   │   ├── containers
│   │   │   │   └── RecycleBin (Recycle bin)
│   │   │   └── routes (Routing configuration)
│   │   │   └── index.js
│   │   ├── network (Network)
│   │   │   ├── App.jsx
│   │   │   ├── containers
│   │   │   │   ├── FloatingIp (Floating ip)
│   │   │   │   ├── LoadBalancers (Load balancing)
│   │   │   │   ├── Network (Network)
│   │   │   │   ├── QoSPolicy (Qos policy)
│   │   │   │   ├── Router (Routing)
│   │   │   │   ├── SecurityGroup (Security group)
│   │   │   │   ├── Topology (Network topology)
│   │   │   │   ├── VPN (VPN)
│   │   │   │   └── VirtualAdapter (Virtual Adapter)
│   │   │   └── routes (Routing configuration)
│   │   │   └── index.js
│   │   ├── storage (Storage)
│   │   │   ├── App.jsx
│   │   │   ├── containers
│   │   │   │   ├── Backup (Backup)
│   │   │   │   ├── Snapshot (Volume snapshot)
│   │   │   │   ├── Storage (Storage backend)
│   │   │   │   ├── Volume (Volume)
│   │   │   │   └── VolumeType (Volume type)
│   │   │   │   ├── QosSpec (QoS)
│   │   │   │   ├── VolumeType (Volume type)
│   │   │   │   └── index.jsx
│   │   │   └── routes ()
│   │   │   └── index.js
│   │   └── user (Login page)
│   │   ├── App.jsx
│   │   ├── containers
│   │   │   ├── ChangePassword (Change password-according to system configuration)
│   │   │   │   ├── index.jsx
│   │   │   │   └── index.less
│   │   │   └── Login (Login)
│   │   │   ├── index.jsx
│   │   │   └── index.less
│   │   └── routes (Routing configuration)
│   │   └── index.js
│   ├── resources (Store the public functions and status of each resource used by itself)
│   ├── stores (Data processing, divide folders by resource type)
│   │   ├── base-list.js (Base class for list data)
│   │   ├── base.js (Base class for data manipulation)
│   │   ├── cinder
│   │   ├── glance
│   │   ├── heat
│   │   ├── ironic
│   │   ├── keystone
│   │   ├── neutron
│   │   ├── nova
│   │   ├── octavia
│   │   ├── overview-admin.js
│   │   ├── project.js
│   │   ├── root.js
│   │   └── skyline
│   ├── styles (Public styles)
│   │   ├── base.less
│   │   ├── main.less
│   │   ├── reset.less
│   │   └── variables.less
│   └── utils (Public functions)
│   ├── RouterConfig.jsx
│   ├── constants.js
│   ├── cookie.js
│   ├── file.js
│   ├── file.spec.js
│   ├── index.js
│   ├── index.test.js (Unit testing)
│   ├── local-storage.js
│   ├── local-storage.spec.js (Unit testing)
│   ├── request.js
│   ├── table.jsx
│   ├── time.js
│   ├── time.spec.js
│   ├── translate.js
│   ├── translate.spec.js
│   ├── validate.js
│   ├── yaml.js
│   └── yaml.spec.js
├── test
│   ├── e2e (E2E testing)
│   └── unit (Unit testing)
├── tools
│   └── git_config
│   └── commit_message.txt
└── yarn.lock

View File

@ -1,2 +1,121 @@
Ready To Work
~~~~~~~~~~~~~~
For more information about installation, refer to the :ref:`source-install-ubuntu`
Preparation before development
------------------------------
- Node environment
- Requirement in package.json: ``"node": ">=10.22.0"``
- Verify nodejs version
.. code-block:: console
node -v
- Yarn
- Install yarn
.. code-block:: console
npm install -g yarn
- Install dependencies
- Execute in the project root directory, which is the same level as
``package.json``, and wait patiently for the installation to complete
.. code-block:: console
yarn install
- Prepare a usable backend
- Prepare an accessible backend, for example: ``https://172.20.154.250``
- Modify the corresponding configuration in ``config/webpack.dev.js``:
.. code-block:: javascript
if (API === 'mock' || API === 'dev') {
devServer.proxy = {
'/api': {
target: 'https://172.20.154.250',
changeOrigin: true,
secure: false,
},
};
}
- Configure access host and port
- Modify :guilabel:`devServer.host` and :guilabel:`devServer.port`
- Modify the corresponding configuration in ``config/webpack.dev.js``
.. code-block:: javascript
const devServer = {
host: '0.0.0.0',
// host: 'localhost',
port: 8088,
contentBase: root('dist'),
historyApiFallback: true,
compress: true,
hot: true,
inline: true,
disableHostCheck: true,
// progress: true
};
- Completed
- Execute in the project root directory, which is the same level
as ``package.json``
.. code-block:: console
yarn run dev
- Use the :guilabel:`host` and :guilabel:`port` configured in
``config/webpack.dev.js`` to access, such as ``http://localhost:8088``
- The front-end real-time update environment used for development is done.
Front-end package used in production environment
------------------------------------------------
Have the required ``nodejs`` and ``yarn``
Execute in the project root directory, which is the same level
as ``package.json``
.. code-block:: console
yarn run build
The packaged files are in the ``dist`` directory and handed over
to the deployment personnel.
Front-end package used for testing
-----------------------------------
Have the required ``nodejs`` and ``yarn``
Execute in the project root directory, which is the same level
as ``package.json``
.. code-block:: console
yarn run build:test
The packaged files are in the ``dist`` directory
.. note::
This test package is designed to measure code coverage
It is recommended to use nginx to complete the E2E test with code coverage

View File

@ -1,99 +1,99 @@
Catalog Introduction
~~~~~~~~~~~~~~~~~~~~
.. code-block:: text
.. code-block:: text
test
├── e2e (E2E code storage location)
│ ├── config
│ │ ├── config.yaml (Part of the configuration when E2E running, mainly configures the test case file list, login account and other information)
│ │ └── local_config.yaml (Part of the configuration when E2E running, mainly configures the test case file list, login account and other information, which is gitignore and has a higher priority than config.yaml)
│ ├── fixtures (Store upload files, read files, etc. required during operation)
│ │ ├── keypair (Test file read by key)
│ │ ├── metadata.json (Test metadata read file)
│ │ ├── stack-content.yaml (Files read by the test stack)
│ │ └── stack-params.yaml (Files read by the test stack)
│ ├── integration (Store unit test)
│ │ └── pages (Adjust the directory according to the webpage menu structure)
│ │ ├── compute (compute)
│ │ │ ├── aggregate.spec.js (aggregate)
│ │ │ ├── baremetal.spec.js (baremetal)
│ │ │ ├── flavor.spec.js (instance flavor)
│ │ │ ├── hypervisor.spec.js (hypervisor)
│ │ │ ├── image.spec.js (image)
│ │ │ ├── instance.spec.js (instance)
│ │ │ ├── ironic.spec.js (ironic)
│ │ │ ├── keypair.spec.js (keypair)
│ │ │ └── server-group.spec.js (server group)
│ │ ├── configuration (Platform configuration)
│ │ │ ├── metadata.spec.js (metadata)
│ │ │ └── system.spec.js (system info)
│ │ ├── error.spec.js (error page)
│ │ ├── heat (heat)
│ │ │ └── stack.spec.js (stack)
│ │ ├── identity (identity)
│ │ │ ├── domain.spec.js (Domain)
│ │ │ ├── project.spec.js (Project)
│ │ │ ├── role.spec.js (Role)
│ │ │ ├── user-group.spec.js (User group)
│ │ │ └── user.spec.js (User)
│ │ ├── login.spec.js (Login)
│ │ ├── management (Operation management)
│ │ │ └── recycle-bin.spec.js (Recycle)
│ │ ├── network (Network)
│ │ │ ├── floatingip.spec.js (Floating ip)
│ │ │ ├── lb.spec.js (Loadbalance)
│ │ │ ├── network.spec.js (Network)
│ │ │ ├── qos-policy.spec.js (Qos policy)
│ │ │ ├── router.spec.js (Router)
│ │ │ ├── security-group.spec.js (Security group)
│ │ │ ├── topology.spec.js (Network topology)
│ │ │ ├── port.spec.js (Virtual Adapter)
│ │ │ └── vpn.spec.js (VPN)
│ │ └── storage (Storage)
│ │ ├── backup.spec.js (Backup)
│ │ ├── qos.spec.js (QoS)
│ │ ├── snapshot.spec.js (Volume snapshot)
│ │ ├── storage.spec.js (Storage)
│ │ ├── volume-type.spec.js (Volume type)
│ │ └── volume.spec.js (Volume)
│ ├── plugins (Cypress plugins)
│ │ └── index.js (Configured to read the configuration file, configured to use the code coverage function)
│ ├── report (Store E2E test report)
│ │ ├── merge-report.html (The final test report that records the execution of each use case)
│ │ └── merge-report.json (Summary of test results in the results directory)
│ ├── results (Store test result files)
│ ├── screenshots (Store a snapshot of the test error)
│ ├── support (When writing a test case, double-wrapped function)
│ │ ├── commands.js (Store login, logout and other operation functions)
│ │ ├── common.js (Store base functions)
│ │ ├── constants.js (Store the route of each resource)
│ │ ├── detail-commands.js (Store the functions related to the resource detail page, based on the framework, the operation of the detail page is consistent)
│ │ ├── form-commands.js (Stores form-related functions, based on the framework, consistent with the operation of form items)
│ │ ├── index.js
│ │ ├── resource-commands.js (Store functions related to resource operations, such as creating instance, creating router, deleting resources, etc.)
│ │ └── table-commands.js (Store the functions related to the resource list based on the framework, and it has consistency in the operation of the lis)
│ └── utils (Store the read function for the configuration file)
│ └── index.js
└── unit (Unit test)
├── local-storage-mock.js ( Storage mock function in local)
├── locales (Translation files used when testing internationalization)
│ ├── en-US.js
│ └── zh-CN.js
├── setup-tests.js (setup uni test)
└── svg-mock.js (Mock of image loading)
test
├── e2e (E2E code storage location)
│ ├── config
│ │ ├── config.yaml (Part of the configuration when E2E running, mainly configures the test case file list, login account and other information)
│ │ └── local_config.yaml (Part of the configuration when E2E running, mainly configures the test case file list, login account and other information, which is gitignore and has a higher priority than config.yaml)
│ ├── fixtures (Store upload files, read files, etc. required during operation)
│ │ ├── keypair (Test file read by key)
│ │ ├── metadata.json (Test metadata read file)
│ │ ├── stack-content.yaml (Files read by the test stack)
│ │ └── stack-params.yaml (Files read by the test stack)
│ ├── integration (Store unit test)
│ │ └── pages (Adjust the directory according to the webpage menu structure)
│ │ ├── compute (compute)
│ │ │ ├── aggregate.spec.js (aggregate)
│ │ │ ├── baremetal.spec.js (baremetal)
│ │ │ ├── flavor.spec.js (instance flavor)
│ │ │ ├── hypervisor.spec.js (hypervisor)
│ │ │ ├── image.spec.js (image)
│ │ │ ├── instance.spec.js (instance)
│ │ │ ├── ironic.spec.js (ironic)
│ │ │ ├── keypair.spec.js (keypair)
│ │ │ └── server-group.spec.js (server group)
│ │ ├── configuration (Platform configuration)
│ │ │ ├── metadata.spec.js (metadata)
│ │ │ └── system.spec.js (system info)
│ │ ├── error.spec.js (error page)
│ │ ├── heat (heat)
│ │ │ └── stack.spec.js (stack)
│ │ ├── identity (identity)
│ │ │ ├── domain.spec.js (Domain)
│ │ │ ├── project.spec.js (Project)
│ │ │ ├── role.spec.js (Role)
│ │ │ ├── user-group.spec.js (User group)
│ │ │ └── user.spec.js (User)
│ │ ├── login.spec.js (Login)
│ │ ├── management (Operation management)
│ │ │ └── recycle-bin.spec.js (Recycle)
│ │ ├── network (Network)
│ │ │ ├── floatingip.spec.js (Floating ip)
│ │ │ ├── lb.spec.js (Loadbalance)
│ │ │ ├── network.spec.js (Network)
│ │ │ ├── qos-policy.spec.js (Qos policy)
│ │ │ ├── router.spec.js (Router)
│ │ │ ├── security-group.spec.js (Security group)
│ │ │ ├── topology.spec.js (Network topology)
│ │ │ ├── port.spec.js (Virtual Adapter)
│ │ │ └── vpn.spec.js (VPN)
│ │ └── storage (Storage)
│ │ ├── backup.spec.js (Backup)
│ │ ├── qos.spec.js (QoS)
│ │ ├── snapshot.spec.js (Volume snapshot)
│ │ ├── storage.spec.js (Storage)
│ │ ├── volume-type.spec.js (Volume type)
│ │ └── volume.spec.js (Volume)
│ ├── plugins (Cypress plugins)
│ │ └── index.js (Configured to read the configuration file, configured to use the code coverage function)
│ ├── report (Store E2E test report)
│ │ ├── merge-report.html (The final test report that records the execution of each use case)
│ │ └── merge-report.json (Summary of test results in the results directory)
│ ├── results (Store test result files)
│ ├── screenshots (Store a snapshot of the test error)
│ ├── support (When writing a test case, double-wrapped function)
│ │ ├── commands.js (Store login, logout and other operation functions)
│ │ ├── common.js (Store base functions)
│ │ ├── constants.js (Store the route of each resource)
│ │ ├── detail-commands.js (Store the functions related to the resource detail page, based on the framework, the operation of the detail page is consistent)
│ │ ├── form-commands.js (Stores form-related functions, based on the framework, consistent with the operation of form items)
│ │ ├── index.js
│ │ ├── resource-commands.js (Store functions related to resource operations, such as creating instance, creating router, deleting resources, etc.)
│ │ └── table-commands.js (Store the functions related to the resource list based on the framework, and it has consistency in the operation of the lis)
│ └── utils (Store the read function for the configuration file)
│ └── index.js
└── unit (Unit test)
├── local-storage-mock.js ( Storage mock function in local)
├── locales (Translation files used when testing internationalization)
│ ├── en-US.js
│ └── zh-CN.js
├── setup-tests.js (setup uni test)
└── svg-mock.js (Mock of image loading)
#. E2E test code, stored in the ``test/e2e`` directory
E2E test code, stored in the ``test/e2e`` directory
- Other global configurations of E2E are stored in ``cypress.json``
- Other global configurations of E2E are stored in ``cypress.json``
#. The basic code of the unit test is stored in the ``test/unit`` directory
The basic code of the unit test is stored in the ``test/unit`` directory
- Other global configuration of unit test, stored in ``jest.config.js``
- Other global configuration of unit test, stored in ``jest.config.js``
- The test code of the unit test is usually placed in the same directory
as the file to be tested, and has a suffix of ``test.js`` or ``spec.js``
- The test code of the unit test is usually placed in the same directory
as the file to be tested, and has a suffix of ``test.js`` or ``spec.js``
- case: ``src/utils/index.js`` and ``src/utils/index.test.js``
- case: ``src/utils/index.js`` and ``src/utils/index.test.js``
- case: ``src/utils/local-storage.js`` and ``src/utils/local-storage.spec.js``
- case: ``src/utils/local-storage.js`` and ``src/utils/local-storage.spec.js``

View File

@ -13,118 +13,128 @@ The following is an introduction, taking the instance use case
Generally, when testing the corresponding functions of a resource,
follow the following order
#. Prepare relevant variables in text
1. Prepare relevant variables in text
-------------------------------------
- Required parameters when creating a resource, such as: name, password
- Required parameters when creating a resource, such as: name, password
- Required parameters when editing resources, such as: new name
- Required parameters when editing resources, such as: new name
- When creating an associated resource, the name of the associated resource,
such as: network name, router name, volume name
- When creating an associated resource, the name of the associated resource,
such as: network name, router name, volume name
.. code-block:: javascript
.. code-block:: javascript
const uuid = Cypress._.random(0, 1e6);
const name = `e2e-instance-${uuid}`;
const newname = `${name}-1`;
const password = 'passW0rd_1';
const volumeName = `e2e-instance-attach-volume-${uuid}`;
const networkName = `e2e-network-for-instance-${uuid}`;
const routerName = `e2e-router-for-instance-${uuid}`;
const uuid = Cypress._.random(0, 1e6);
const name = `e2e-instance-${uuid}`;
const newname = `${name}-1`;
const password = 'passW0rd_1';
const volumeName = `e2e-instance-attach-volume-${uuid}`;
const networkName = `e2e-network-for-instance-${uuid}`;
const routerName = `e2e-router-for-instance-${uuid}`;
#. Login before operation
2. Login before operation
-------------------------
- If you are operating console resources, please use :guilabel:`cy.login`
- If you are operating console resources, please use :guilabel:`cy.login`
- If you are operating administrator resource, please use :guilabel:`cy.loginAdmin`
- If you are operating administrator resource, please use :guilabel:`cy.loginAdmin`
- Generally, the variable :guilabel:`listUrl` is used in the
:guilabel:`login` and :guilabel:`loginAdmin` functions, that is,
directly access the page where the resource is located after logging in
- Generally, the variable :guilabel:`listUrl` is used in the
:guilabel:`login` and :guilabel:`loginAdmin` functions, that is,
directly access the page where the resource is located after logging in
.. code-block:: javascript
.. code-block:: javascript
beforeEach(() => {
cy.login(listUrl);
});
beforeEach(() => {
cy.login(listUrl);
});
#. Create associated resources, use the resource creation function provided in
``resource-commands.js``, take the test instance as an example
3. Create associated resources
------------------------------
- Create a network for testing to create a instance, attach interface
Create associated resources, use the resource creation function provided in
``resource-commands.js``, take the test instance as an example
.. code-block:: javascript
- Create a network for testing to create a instance, attach interface
cy.createNetwork({ name: networkName });
.. code-block:: javascript
- Create router :guilabel:`cy.createRouter` to ensure that the
floating IP is reachable when testing the associated floating IP
cy.createNetwork({ name: networkName });
- The router created in the following way will open the external network
gateway and bind the subnet of the :guilabel:`networkName` network
- Create router :guilabel:`cy.createRouter` to ensure that the
floating IP is reachable when testing the associated floating IP
.. code-block:: javascript
- The router created in the following way will open the external network
gateway and bind the subnet of the :guilabel:`networkName` network
cy.createRouter({ name: routerName, network: networkName });
.. code-block:: javascript
- Create floating ip :guilabel:`cy.createFip`,
Used to test associate floating ip
cy.createRouter({ name: routerName, network: networkName });
.. code-block:: javascript
- Create floating ip :guilabel:`cy.createFip`,
Used to test associate floating ip
cy.createFip();
.. code-block:: javascript
- Create volume :guilabel:`cy.createVolume` (Used to test attach volume)
cy.createFip();
.. code-block:: javascript
- Create volume :guilabel:`cy.createVolume` (Used to test attach volume)
cy.createVolume(volumeName);
.. code-block:: javascript
#. Write cases for creating resources
cy.createVolume(volumeName);
#. Write use cases for accessing resource details
4. Write cases
--------------
#. Write use cases corresponding to all operations of resources separately
- Write cases for creating resources
- Write use cases for accessing resource details
- Write use cases corresponding to all operations of resources separately
Generally, the use case of the :guilabel:`edit` operation is written later,
and then the use case of the :guilabel:`delete` operation is written,
so that you can test whether the editing is effective
#. To delete associated resources, use the resource-deleting function provided
in ``resource-commands.js``, this is to make the resources in the test
account as clean as possible after the test case is executed
5. delete associated resources
-------------------------------
- Delete Floating IP
To delete associated resources, use the resource-deleting function provided
in ``resource-commands.js``, this is to make the resources in the test
account as clean as possible after the test case is executed
.. code-block:: javascript
- Delete Floating IP
cy.deleteAll('fip');
.. code-block:: javascript
- Delete Router :guilabel:`routerName`
cy.deleteAll('fip');
.. code-block:: javascript
- Delete Router :guilabel:`routerName`
cy.deleteRouter(routerName, networkName);
.. code-block:: javascript
- Delete Network :guilabel:`networkName`
cy.deleteRouter(routerName, networkName);
.. code-block:: javascript
- Delete Network :guilabel:`networkName`
cy.deleteAll('network', networkName);
.. code-block:: javascript
- Delete Volume :guilabel:`volumeName`
cy.deleteAll('network', networkName);
.. code-block:: javascript
- Delete Volume :guilabel:`volumeName`
cy.deleteAll('volume', volumeName);
.. code-block:: javascript
- Delete all available volume
cy.deleteAll('volume', volumeName);
.. code-block:: javascript
- Delete all available volume
cy.deleteAllAvailableVolume();
.. code-block:: javascript
The ``4``, ``5``, and ``6`` in the above steps are mainly used
cy.deleteAllAvailableVolume();
Reference
----------
- The function operation form in ``test/e2e/support/form-commands.js``,
please refer to the detailed introduction