Giter Site home page Giter Site logo

chatunitest-maven-plugin's Introduction

📣 ChatUnitest Maven Plugin

logo

English | 中文

Maven Central

Updates:

💥 Add docker image to generate tests in isolated sandbox environment.

💥 Added multithreading feature for faster test generation.

💥 Plugin now exports runtime and error logs.

💥 Custom prompt support added.

💥 Algorithm optimized to minimize token usage.

💥 Expanded configuration options. Refer to Steps to Run for details.

Background

Many people have tried using ChatGPT to help them with various programming tasks and have achieved good results. However, there are some issues with using ChatGPT directly. Firstly, the generated code often fails to execute correctly, leading to the famous saying "five minutes to code, two hours to debug". Secondly, it is inconvenient to integrate with existing projects as it requires manual interaction with ChatGPT and switching between different platforms. To address these problems, we have proposed the "Generate-Validate-Repair" framework and implemented a prototype. Additionally, to make it easier for everyone to use, we have developed some plugins that can be seamlessly integrated into existing development workflows.

Steps to run (Docker)

See chenyi26/chatunitest.

Steps to run

0. Add our plugin to pom.xml and config

You can configure the plugin with the following parameters to your pom.xml file:

<plugin>
    <groupId>io.github.ZJU-ACES-ISE</groupId>
    <artifactId>chatunitest-maven-plugin</artifactId>
    <version>1.4.1</version>
    <configuration>
        <!-- Required: You must specify your OpenAI API keys. -->
        <apiKeys></apiKeys>
        <model>gpt-3.5-turbo</model>
    </configuration>
</plugin>

Here's a detailed explanation of each configuration option:

  • apiKeys: (Required) Your OpenAI API keys. Example: Key1, Key2, ....
  • model: (Optional) The OpenAI model. Default: gpt-3.5-turbo.
  • url: (Optional) The API to use your model. Default: "https://api.openai.com/v1/chat/completions".
  • testNumber: (Optional) The number of tests for each method. Default: 5.
  • maxRounds: (Optional) The maximum rounds of the repair process. Default: 5.
  • minErrorTokens: (Optional) The minimum tokens of error message in the repair process. Default: 500.
  • temperature: (Optional) The OpenAI API parameters. Default: 0.5.
  • topP: (Optional) The OpenAI API parameters. Default: 1.
  • frequencyPenalty: (Optional) The OpenAI API parameters. Default: 0.
  • presencePenalty: (Optional) The OpenAI API parameters. Default: 0.
  • proxy: (Optional) Your host name and port number if you need. Example:127.0.0.1:7078.
  • selectClass: (Optional) Class under test. If the project contains the same class name in different packages, the className should be specified as the fully qualified name.
  • selectMethod: (Optional) Method under test.
  • tmpOutput: (Optional) The output path for parsed information. Default: /tmp/chatunitest-info.
  • testOutput: (Optional) The output path for tests generated by chatunitest. Default: {basedir}/chatunitest.
  • project: (Optional) The target project path. Default: {basedir}.
  • thread: (Optional) Enable multi-threaded execution. Default: true.
  • maxThread: (Optional) The maximum number of threads. Default: CPU cores * 5.
  • stopWhenSuccess: (Optional) Stop the repair process when the test passes. Default: true.
  • noExecution: (Optional) Skip the execution verification step of generated tests. Default: false.
  • merge : (Optional) Merge all tests for each focal class. Default: true.
  • promptPath : (Optional) Path to your custom prompt. Refer to default prompt in src/main/resources/prompt.
  • obfuscate : (Optional) Enable prompt obfuscation for enhanced privacy protection. Default: false.
  • obfuscateGroupIds : (Opional) Group IDs you want to obfuscate. Default: only your group ID.

All these parameters also can be specified in the command line with -D option.

Essentially, the only thing you need to provide are your API keys.

If you use local LLM (such as code-llama), simply specify the model and url in the configuration:

<plugin>
    <groupId>io.github.ZJU-ACES-ISE</groupId>
    <artifactId>chatunitest-maven-plugin</artifactId>
    <version>1.4.1</version>
    <configuration>
        <!-- Required: Use any string to replace your API keys -->
        <apiKeys>xxx</apiKeys>
        <model>code-llama</model>
        <url>http://0.0.0.0:8000/v1/chat/completions</url>
    </configuration>
</plugin>

1. Add the following dependency to pom.xml

<dependency>
    <groupId>io.github.ZJU-ACES-ISE</groupId>
    <artifactId>chatunitest-starter</artifactId>
    <version>1.4.0</version>
    <type>pom</type>
</dependency>

2. Run

First, you need to install your project and download all necessary dependencies, which can be done by running mvn install command.

You can run the plugin with the following command:

Generate unit tests for the target method:

mvn chatunitest:method -DselectMethod=className#methodName

Generate unit tests for the target class:

mvn chatunitest:class -DselectClass=className

You must specify selectMethod and selectClass when executing mvn chatunitest:method or mvn chatunitest:class. This is done using the -D option.

Example:

public class Example {
    public void method1(Type1 p1, ...) {...}
    public void method2() {...}
    ...
}

To test the class Example and all methods in it:

mvn chatunitest:class -DselectClass=Example

To test the method method1 in the class Example (Now ChatUnitest will generate tests for all methods named method1 in the class)

mvn chatunitest:method -DselectMethod=Example#method1

Generate unit tests for the whole project:

⚠️ ⚠️ ⚠️ For a large project, it may consume a significant number of tokens, resulting in a substantial bill.

mvn chatunitest:project

Clean the generated tests:

mvn chatunitest:clean

Running this command will delete all generated tests and restore your test folder.

Run the generated tests manually:

mvn chatunitest:copy

Running this command will copy the generated tests into the src/test/java/ directory for your convenience when you want to run the tests manually. Your test folder will be backed up in the src/back/ directory.

If the merge configuration is enabled, you can run the test suites instead of individual tests for each class.

mvn chatunitest:restore

Running this command will restore the test folder from the backup in the src/back/ directory.

mvn chatunitest:generateCoverage
<plugin>
    <groupId>io.github.ZJU-ACES-ISE</groupId>
    <artifactId>chatunitest-maven-plugin</artifactId>
    <version>1.3.0</version>
    <configuration>
        <targetDir>D:\\coverage</targetDir>
        <mavenHome>C:\\software\\apache-maven-3.9.2</mavenHome>
        <sourceDir>chatunitest</sourceDir>
    </configuration>
</plugin>

Running this method will execute the tests in the folder sourceDir, the coverage result of the project will remove to folder targetDir.

mvn chatunitest:generateMethodCoverage_separate
<plugin>
    <groupId>io.github.ZJU-ACES-ISE</groupId>
    <artifactId>chatunitest-maven-plugin</artifactId>
    <version>1.3.0</version>
    <configuration>
        <targetDir>D:\\coverage</targetDir>
        <mavenHome>C:\\software\\apache-maven-3.9.2</mavenHome>
        <sourceDir>chatunitest</sourceDir>
    </configuration>
</plugin>

Running this method will execute all the test classes in sourceDir separately and calculate separate coverage for each test class, the result are saved in the methodCoverage_SEPARATE.json file under targetDir.

mvn chatunitest:generateMethodCoverage_merge

Running this method will group the test classes according to the target test class( the test classes for the same method will be summarized into a group). For test classes in the same grouping, the program generates test coverage by subdividing the groups from 1-1 to 1-n and the test coverage calculation will be performed by group, the result are saved in the methodCoverage_MERGE.json file under targetDir.

Requirements

This Maven plugin can be executed in various operating systems with different Java Development Kits (JDK) and Maven versions. The following environments have been tested and proven to work:

  • Environment 1: Windows 11 / Oracle JDK 11 / Maven 3.9
  • Environment 2: Windows 10 / Oracle JDK 11 / Maven 3.6
  • Environment 3: Ubuntu 22.04 / OpenJDK 11 / Maven 3.6
  • Environment 4: Darwin Kernel 22.1.0 / Oracle JDK 11 / Maven 3.8

Please note that these environments are tested and known to work. You can also try running the plugin in similar environments. If you encounter any issues in other environments, please refer to the documentation or seek appropriate support.

🚧 TODO

  • Add code obfuscation to avoid sending the original code to ChatGPT.
  • Add expense estimation and quota.
  • Optimize the structure of generated test cases.

MISC

Our work has been submitted to arXiv. Check it out here: ChatUniTest.

@misc{xie2023chatunitest,
      title={ChatUniTest: a ChatGPT-based automated unit test generation tool}, 
      author={Zhuokui Xie and Yinghao Chen and Chen Zhi and Shuiguang Deng and Jianwei Yin},
      year={2023},
      eprint={2305.04764},
      archivePrefix={arXiv},
      primaryClass={cs.SE}
}

📧 Contact us

If you have any questions or would like to inquire about our experimental results, please feel free to contact us via email. The email addresses of the authors are as follows:

  1. Corresponding author: zjuzhichen AT zju.edu.cn
  2. Author: yh_ch AT zju.edu.cn, xiezhuokui AT zju.edu.cn

chatunitest-maven-plugin's People

Contributors

coder-chenzhi avatar felinevolant avatar nccurry30 avatar xiezhuokui avatar zzzghttt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

chatunitest-maven-plugin's Issues

java.util.zip.ZipException: zip END header not found

您好,我尝试了一下,报了很多java.util.zip.ZipException: zip END header not found,使用
find . -name "*.jar" -exec sh -c 'jar tf {} >/dev/null || echo "Invalid JAR: {}"' ;
命令,查找无效的jar包,没有找到;请问还有别的排查方法吗?

[DEBUG] building maven31 dependency graph for xxx.xxxx.xxxxx:xxxxx-xxxxx-xxxxxx:jar:1.0.0-SNAPSHOT with Maven31DependencyGraphBuilder
[DEBUG] Dependency collection stats: {ConflictMarker.analyzeTime=789001, ConflictMarker.markTime=6568679, ConflictMarker.nodeCount=293, ConflictIdSorter.graphTime=1802341, ConflictIdSorter.topsortTime=244890, ConflictIdSorter.conflictIdCount=120, ConflictIdSorter.conflictIdCycleCount=0, ConflictResolver.totalTime=14165791, ConflictResolver.conflictItemCount=222, DefaultDependencyCollector.collectTime=73763556, DefaultDependencyCollector.transformTime=23739181}
[DEBUG] com.xxxx.xxxx:xxxxx-xxxx-xxxxx:jar:1.0.0-SNAPSHOT
[DEBUG] com.xxxx.xxxx:xxxxx-xxx:jar:1.0.0-SNAPSHOT:compile
[DEBUG] org.apache.commons:commons-lang3:jar:3.10:compile (version managed from 3.10)
[DEBUG] org.slf4j:slf4j-api:jar:1.7.30:compile (version managed from 1.7.30)
[DEBUG] org.springframework:spring-beans:jar:5.2.8.RELEASE:compile (version managed from 5.2.8.RELEASE)
[DEBUG] org.springframework:spring-context:jar:5.2.8.RELEASE:compile (version managed from 5.2.8.RELEASE)
[DEBUG] org.springframework:spring-aop:jar:5.2.8.RELEASE:compile (version managed from 5.2.8.RELEASE)
[DEBUG] org.springframework:spring-expression:jar:5.2.8.RELEASE:compile (version managed from 5.2.8.RELEASE)
[DEBUG] org.springframework:spring-core:jar:5.2.8.RELEASE:compile (version managed from 5.2.8.RELEASE)
[DEBUG] org.springframework:spring-jcl:jar:5.2.8.RELEASE:compile (version managed from 5.2.8.RELEASE)
[DEBUG] org.apache.httpcomponents:httpclient:jar:4.5.12:compile (version managed from 4.5.12) (exclusions managed from [commons-logging:commons-logging::])
[DEBUG] org.apache.httpcomponents:httpcore-nio:jar:4.4.13:compile (version managed from 4.4.13)
[DEBUG] org.apache.httpcomponents:httpasyncclient:jar:4.1.4:compile (version managed from 4.1.4) (exclusions managed from [commons-logging:commons-logging::])
[DEBUG] org.apache.httpcomponents:httpcore:jar:4.4.13:compile (version managed from 4.4.13)
[DEBUG] com.fasterxml.jackson.core:jackson-core:jar:2.11.1:compile (version managed from 2.11.1)
[DEBUG] com.fasterxml.jackson.core:jackson-databind:jar:2.11.1:compile (version managed from 2.11.1)
[DEBUG] com.fasterxml.jackson.core:jackson-annotations:jar:2.11.1:compile (version managed from 2.11.1)
[DEBUG] com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.11.1:compile (version managed from 2.11.1)
[DEBUG] jakarta.activation:jakarta.activation-api:jar:1.2.2:compile (version managed from 1.2.1)
[DEBUG] net.sf.dozer:dozer:jar:5.5.1:compile (version managed from 5.5.1)
[DEBUG] commons-beanutils:commons-beanutils:jar:1.9.3:compile (version managed from 1.9.1)
[DEBUG] org.slf4j:jcl-over-slf4j:jar:1.7.30:compile (version managed from 1.7.5)
[DEBUG] com.belerweb:pinyin4j:jar:2.5.1:compile
[DEBUG] com.google.guava:guava:jar:20.0:compile (version managed from 19.0)
[DEBUG] org.springframework.security:spring-security-jwt:jar:1.0.9.RELEASE:compile
[DEBUG] org.bouncycastle:bcpkix-jdk15on:jar:1.56:compile
[DEBUG] org.bouncycastle:bcprov-jdk15on:jar:1.54:compile (version managed from 1.56)
[DEBUG] com.aliyun.oss:aliyun-sdk-oss:jar:3.7.0:compile (version managed from 3.7.0)
[DEBUG] org.jdom:jdom:jar:1.1:compile
[DEBUG] org.codehaus.jettison:jettison:jar:1.1:compile
[DEBUG] stax:stax-api:jar:1.0.1:compile
[DEBUG] com.aliyun:aliyun-java-sdk-ram:jar:3.0.0:compile
[DEBUG] com.aliyun:aliyun-java-sdk-ecs:jar:4.2.0:compile
[DEBUG] com.aliyun:aliyun-java-sdk-sts:jar:3.0.0:compile
[DEBUG] com.aliyun:aliyun-java-sdk-core:jar:4.4.6:compile
[DEBUG] com.google.code.gson:gson:jar:2.8.5:compile (version managed from 2.8.5)
[DEBUG] commons-logging:commons-logging:jar:1.2:compile (version managed from 1.2)
[DEBUG] javax.xml.bind:jaxb-api:jar:2.3.1:compile (version managed from 2.3.1)
[DEBUG] javax.activation:javax.activation-api:jar:1.2.0:compile (version managed from 1.2.0)
[DEBUG] org.jacoco:org.jacoco.agent:jar:runtime:0.8.3:compile
[DEBUG] org.ini4j:ini4j:jar:0.5.4:compile
[DEBUG] org.springframework.boot:spring-boot:jar:2.3.2.RELEASE:compile (version managed from 2.3.2.RELEASE)
[DEBUG] net.sf.json-lib:json-lib:jar:jdk15:2.4:compile (version managed from 2.4)
[DEBUG] commons-collections:commons-collections:jar:3.2.1:compile
[DEBUG] commons-lang:commons-lang:jar:2.5:compile
[DEBUG] net.sf.ezmorph:ezmorph:jar:1.0.6:compile
[DEBUG] org.springframework.boot:spring-boot-starter-undertow:jar:2.3.2.RELEASE:compile (version managed from 2.3.2.RELEASE)
[DEBUG] io.undertow:undertow-core:jar:2.2.3.Final:compile (version managed from 2.1.3.Final)
[DEBUG] org.jboss.logging:jboss-logging:jar:3.4.1.Final:compile (version managed from 3.4.1.Final)
[DEBUG] org.jboss.xnio:xnio-api:jar:3.8.0.Final:compile
[DEBUG] org.wildfly.common:wildfly-common:jar:1.5.2.Final:compile
[DEBUG] org.wildfly.client:wildfly-client-config:jar:1.0.1.Final:compile
[DEBUG] org.jboss.xnio:xnio-nio:jar:3.8.0.Final:runtime
[DEBUG] org.jboss.threads:jboss-threads:jar:3.1.0.Final:compile
[DEBUG] io.undertow:undertow-servlet:jar:2.2.3.Final:compile (version managed from 2.1.3.Final)
[DEBUG] org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec:jar:2.0.1.Final:compile
[DEBUG] io.undertow:undertow-websockets-jsr:jar:2.2.3.Final:compile (version managed from 2.1.3.Final)
[DEBUG] org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:jar:2.0.0.Final:compile
[DEBUG] jakarta.servlet:jakarta.servlet-api:jar:4.0.4:compile (version managed from 4.0.4)
[DEBUG] org.glassfish:jakarta.el:jar:3.0.3:compile (version managed from 3.0.3)
[DEBUG] com.amazonaws:aws-java-sdk-s3:jar:1.11.792:compile (version managed from 1.11.792) (optionality managed from false)
[DEBUG] com.amazonaws:aws-java-sdk-kms:jar:1.11.792:compile (version managed from 1.11.792) (optionality managed from false)
[DEBUG] com.amazonaws:aws-java-sdk-core:jar:1.11.792:compile (version managed from 1.11.792) (exclusions managed from [])
[DEBUG] software.amazon.ion:ion-java:jar:1.0.2:compile
[DEBUG] com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:jar:2.11.1:compile (version managed from 2.6.7)
[DEBUG] joda-time:joda-time:jar:2.8:compile (version managed from 2.8.1)
[DEBUG] com.amazonaws:jmespath-java:jar:1.11.792:compile (version managed from 1.11.792)
[DEBUG] org.springframework.boot:spring-boot-starter-test:jar:2.3.2.RELEASE:test
[DEBUG] org.springframework.boot:spring-boot-starter:jar:2.3.2.RELEASE:test (version managed from 2.3.2.RELEASE)
[DEBUG] org.springframework.boot:spring-boot-autoconfigure:jar:2.3.2.RELEASE:test (version managed from 2.3.2.RELEASE)
[DEBUG] jakarta.annotation:jakarta.annotation-api:jar:1.3.5:test (version managed from 1.3.5)
[DEBUG] org.yaml:snakeyaml:jar:1.26:test (version managed from 1.26)
[DEBUG] org.springframework.boot:spring-boot-test:jar:2.3.2.RELEASE:test (version managed from 2.3.2.RELEASE)
[DEBUG] org.springframework.boot:spring-boot-test-autoconfigure:jar:2.3.2.RELEASE:test (version managed from 2.3.2.RELEASE)
[DEBUG] com.jayway.jsonpath:json-path:jar:2.4.0:test (version managed from 2.4.0)
[DEBUG] net.minidev:json-smart:jar:2.3:test (version managed from 2.3)
[DEBUG] net.minidev:accessors-smart:jar:1.2:test
[DEBUG] org.ow2.asm:asm:jar:5.0.4:test
[DEBUG] jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3:compile (version managed from 2.3.3)
[DEBUG] org.assertj:assertj-core:jar:3.16.1:test (version managed from 3.16.1)
[DEBUG] org.hamcrest:hamcrest:jar:2.2:test (version managed from 2.2)
[DEBUG] org.skyscreamer:jsonassert:jar:1.5.0:test (version managed from 1.5.0)
[DEBUG] com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test
[DEBUG] org.springframework:spring-test:jar:5.2.8.RELEASE:test (version managed from 5.2.8.RELEASE)
[DEBUG] org.xmlunit:xmlunit-core:jar:2.7.0:test (version managed from 2.7.0)
[DEBUG] xxx.xxxx.xxxxx:xxxxx-config:jar:1.0.0-SNAPSHOT:compile
[DEBUG] org.springframework.boot:spring-boot-starter-log4j2:jar:2.3.2.RELEASE:compile
[DEBUG] org.apache.logging.log4j:log4j-slf4j-impl:jar:2.17.0:compile (version managed from 2.13.3)
[DEBUG] org.apache.logging.log4j:log4j-api:jar:2.17.0:compile (version managed from 2.17.0)
[DEBUG] org.apache.logging.log4j:log4j-core:jar:2.17.0:compile (version managed from 2.13.3)
[DEBUG] org.apache.logging.log4j:log4j-jul:jar:2.17.0:compile (version managed from 2.13.3)
[DEBUG] org.slf4j:jul-to-slf4j:jar:1.7.30:compile (version managed from 1.7.30)
[DEBUG] com.nuonuo:open-sdk:jar:1.0.5.2:compile
[DEBUG] commons-codec:commons-codec:jar:1.14:compile (version managed from 1.12)
[DEBUG] xxx.xxxx.xxxxx:xxxxx-constants:jar:1.0.0-SNAPSHOT:compile
[DEBUG] io.github.ZJU-ACES-ISE:chatunitest-starter:pom:1.0.0:compile
[DEBUG] org.junit.jupiter:junit-jupiter-api:jar:5.6.2:compile (version managed from 5.7.0)
[DEBUG] org.opentest4j:opentest4j:jar:1.2.0:compile
[DEBUG] org.junit.platform:junit-platform-commons:jar:1.6.2:compile (version managed from 1.6.2)
[DEBUG] org.junit.platform:junit-platform-launcher:jar:1.6.2:compile (version managed from 1.9.2)
[DEBUG] org.junit.jupiter:junit-jupiter-engine:jar:5.6.2:runtime (version managed from 5.7.0)
[DEBUG] org.mockito:mockito-core:jar:3.4.4:test
[DEBUG] net.bytebuddy:byte-buddy:jar:1.10.13:test (version managed from 1.10.13)
[DEBUG] net.bytebuddy:byte-buddy-agent:jar:1.10.13:test (version managed from 1.10.13)
[DEBUG] org.objenesis:objenesis:jar:2.6:test
[DEBUG] org.mockito:mockito-junit-jupiter:jar:4.4.0:test
[DEBUG] org.mockito:mockito-inline:jar:3.3.3:test
[DEBUG] org.powermock:powermock-api-mockito2:jar:2.0.9:test
[DEBUG] org.powermock:powermock-api-support:jar:2.0.9:test
[DEBUG] org.powermock:powermock-reflect:jar:2.0.9:test
[DEBUG] org.powermock:powermock-core:jar:2.0.9:test
[DEBUG] org.javassist:javassist:jar:3.27.0-GA:test
[DEBUG] org.powermock:powermock-module-junit4:jar:2.0.9:test
[DEBUG] org.powermock:powermock-module-junit4-common:jar:2.0.9:test
[DEBUG] junit:junit:jar:4.12:test (version managed from 4.12)
[DEBUG] org.hamcrest:hamcrest-core:jar:2.2:test (version managed from 1.3)
[DEBUG] org.junit.jupiter:junit-jupiter:jar:5.8.2:test
[DEBUG] org.junit.jupiter:junit-jupiter-params:jar:5.6.2:test (version managed from 5.8.2)
[DEBUG] org.junit.vintage:junit-vintage-engine:jar:5.6.2:test
[DEBUG] org.apiguardian:apiguardian-api:jar:1.1.0:compile
[DEBUG] org.junit.platform:junit-platform-engine:jar:1.6.2:compile (version managed from 1.6.2)
java.util.zip.ZipException: zip END header not found
In ClassParser.extractClass Exception: java.lang.RuntimeException: In ClassParser getMethodSignature: fromJson

Remove unnecessary plugin configurations

It is unnecessary to ask users to set parameters (like selectClass and selectMethod) in plugin configurations. We can replace them with default values in parameter definitions of MOJO.

// https://github.com/ZJU-ACES-ISE/chatunitest-maven-plugin/blob/main/src/main/java/zju/cst/aces/ProjectTestMojo.java#L47-L50
@Parameter( defaultValue = "${session}", readonly = true, required = true )
private MavenSession session;
@Parameter(defaultValue = "${project}", readonly = true, required = true)
public MavenProject project;

Remember to change the README.md

Hanging on for a long time and exiting with NPE

image

It seems like a timeout issue with the OPENAI interface, but even after enabling a global proxy, the problem remains unresolved.
The error message is too vague to locate the bug.

Platform: Windows 11
JDK: Oracle JDK 11
Maven: 3.9.1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.